I am working on a project that involves a lot of immutable classes. We are interested in marking these classes as sealed, but are concerned that if we ever decide to "unseal" a class at a later time that it will cause a runtime or compile time error for the customers of our API. Is there any merit to this concern, or will unsealing a class cause no runtime / compile time issues?
Unsealing a class will not cause any additional compile time errors. It is possible for unsealing a class to allow previously uncompilable code to compile, but not the other way around.
It is possible to cause a number of runtime issues but I think they would be pretty rare because it would require the consumer to be inspecting the type metadata. For instance it would be possible for a user to throw if a type was unsealed but I'm not sure that is a major concern.
Removing the sealed attribute from your class in an updated version of your framework will merely allow them to derive from your class whereas they previously couldn't do so. As long as your updated version does not require your clients to derive from your class, I can't think of any problem.
Another effect of unsealing the class is that the runtime won't be able to optimize away some virtual function calls, but that's not going to cause any problems either.