You could implement a static method to try to deserialize each possible type. This way you wouldn't have to break your object model, to support run-time type discovery.
You would still have to have some guesses for the types stored in the XML file. The simle XML file serialization does not store detailed type information by default. It seems like there should be an attribute that forces the serializer to store the detailed type name, but I couldn't find it...
public static bool TryDeserialize<T>(XmlReader reader, out T obj) where T : class
{
// Return null, if we can't deserialize
obj = null;
XmlSerializer deserializer = new XmlSerializer(typeof(T));
bool result = deserializer.CanDeserialize(reader);
if (result)
{
// Get the object, if it's possible
obj = deserializer.Deserialize(reader) as T;
}
return result;
}