If (and only if!) UFunc dispatching appears to be possible solely based on something like a safe casting type hierarchy!
Then it seems likely that an abstract hierary (hierarchy defined on AbstractDTypes) serves much less purpose. It may be unnecesssary to define it. At least it is likely unnecessary to define it based on isinstance, but should rather maybe be only defined based on can_cast (or whatever the alternative is).