I would advise against this type of technique. Hashes are very powerful data structures, and so it's tempting to use them for a lot of varying purposes. But as you stated, this introduces risk in the misspelling of keys.
Based off the usage that you described, it sounds like what you actually want are classes. There are lots of cpan modules that make the defining and accessing of class fields very easy. This is one good one:
Class::Accessor
Another typical usage of hashes are named parameters for subroutines. There are also lots of validation techniques for this as well. But here is another module that I find effective:
Params::Validate
Ultimately, your concern about the misnaming of hash keys is alleviated when you recognize that very rarely should you ever be explicitly naming the keys. Algorithms rarely explicitly name the keys. And any other uses have their risk reduced when you put the values in scalars as soon as possible. To remove the final smidge of risk, simply have test scripts for all your core libraries anyway.