what about types as a tree/list of enumerated priority relationships i.e.
(integer
(float bool)
(string)
(gorf))
where each of the above symbols resolves to a number distinguishing one type from another, the first value is the type being declared, and the subsequent lists are what that type is allowed to morph into in any given expression (with values in the same list being of equal priority, allowing for the possibility of ambiguous type morphing errors, if so desired)
maybe the ambiguity isn't really desirable? It seems like a lot of languages have it though