¿Cómo puedo serializar clases internas usando XmlSerializer?

Estoy construyendo una biblioteca para interactuar con un tercero. La comunicación es a través de publicaciones XML y HTTP. Eso está funcionando.

Pero, cualquier código que use la biblioteca no necesita conocer las clases internas. Mis objetos internos se serializan en XML utilizando este método:

internal static string SerializeXML(Object obj)
{
    XmlSerializer serializer = new XmlSerializer(obj.GetType(), "some.domain");

    //settings
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.OmitXmlDeclaration = true;

    using (StringWriter stream = new StringWriter())
    {
        using (XmlWriter writer = XmlWriter.Create(stream, settings))
        {
            serializer.Serialize(writer, obj);
        }
        return stream.ToString();
    }
}

Sin embargo, cuando cambio el modificador de acceso de mis clases ainternal, Recibo una excepción en tiempo de ejecución:

[System.InvalidOperationException] = {"MyNamespace.MyClass es inaccesible debido a su nivel de protección. Solo se pueden procesar tipos públicos."}

Esa excepción ocurre en la primera línea del código anterior.

Me gustaría que las clases de mi biblioteca no sean públicas porque no quiero exponerlas. ¿Puedo hacer eso? ¿Cómo puedo hacer que los tipos internos sean serializables, utilizando mi serializador genérico? ¿Qué estoy haciendo mal