To store the types of amounts in unpacked structures, you will need to use the product encoding. For example. as a tuple of a type tag and a pair of values.
So:
Unbox a, Unbox b => Either a b
-->
Unbox (Int, a, b)
With appropriate default values for empty slots for a and b.