The only problem I have with datatypes is that they aren't really bidirectional. You can generally only save in IFF.
In my minds eye, the ideal implementation would allow each datatype superclass (picture.datatype, sound.datatype etc) to provide a list of all currently known sub-classes that support encoding. You'd then be able to pick one and encode data for that datatype and write it out to disk in that format.