The ISO exception term has no information (see also throw/1) and is completely useless.
A single Term is better (and also sufficient), but one needs to pack and the Toplevel cannot make assumptions on how to print this Term. (Both (incomprehensibly) ISO and (more comprehensibly) the Toplevel make assumptions about the information carried by the terms buried in the other ISO exceptions. That's couter-productive.)
For example: we may want to specify for example that among Terms 1,2,3, the last two were not instantiated (they were maybe partially uninstantiated or maybe fully uninstantiated):
In that case, the following would be a possibility:
instantiation_error( ['X'-X, 'Y'-Y, 'Z'-Z, msg-'X and Y are not sufficiently instantiated but Z is fine'])