Because these types involve special casing. That UnionType works at all is already borderline case and I am unsure works consistently across type checkers. I would be kind of surprised if it did work if you tried pytype, pyre, pyright, and mypy each.
At moment the type hint for something like Union/Literal is under specified and that’s what type form pep is working clarifying.
For static type checkers, it doesn’t matter what is in types.py; they only look at the stubs in typeshed. The type.__or__ method is annotated as returning UnionType, so type checkers support that type, but Literal is a special form and too heavily special-cased for type checkers to know anything about the actual runtime type.