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.
But eh, that is not the case in crystal. You are not on your own - the language knows what a variable is during runtime and you have plenty of ways to dispatch between the types.
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?