Whether using Moose or not, I usually solve the problem by defining a single Config.pm unit which exposes a single variable (or, as the case may be, a subroutine). And so, “here is where all the configuration variables can be found.” All that you have to do is to use it.
Furthermore, I usually define within that unit a conf(variable, variable ...) subroutine which, given a list of keys as its argument list ... (@_) ... traverses the (otherwise private ...) data-structure which it defines, returning a reference that corresponds to the nested list of keys provided ... and dieing if the (nested...) key cannot be found. (This makes an otherwise difficult-to-debug problem trivial to spot, and to trace to the exact bit of code that was requesting it.)
The logic within this accessor-subroutine can be as smart or as dumb as it needs to be. It is simply “the way that everything in the application gets configuration-variables,” and it is equipped to detect and immediately flag any attempts to request undefined keys. Although my code rarely uses actual “singletons,” this is how I would handle any sort of singleton case: a well-known public subroutine returns the appropriate reference on-request.