There are union types, which despite being untagged might be enough in a lot of situations, and I believe has language support in things like switch statements.
https://crystal-lang.org/reference/latest/syntax_and_semanti...
https://crystal-lang.org/reference/latest/syntax_and_semanti...
I honestly have no idea how anything could work if they were not tagged. Like how on earth would you know what method to invoke?
(Basically the programmer has to figure out how discrimination works - you’re kinda on your own).