vm::Datatype was intended for runtime ADT objects. However, it can also be interpreted as datatype in the runtime. As a matter of fact, that is something that comes to my mind when i first saw the class.
It would be great if we can rename it to something less ambiguous. e.g. ADTObj?