Changing the configurations is a big and very touchy job. It is touchy in that it is very exposed to the users and many many applications assume the configuration is dealt with in particular ways. It is a requirement to maintain compatibility and thus that needs to be factored in to the work. Furthermore, you not only have the local configuration, but the way that configuration is done between the clients, servers, and mapreduce tasks. Even little changes in the past (eg. making a copy of a configuration at one spot) have broken both users and frameworks built on top (eg. Pig, Hive, Oozie).
As Bobby said, Configuration is absolutely not a singleton. Many of the servers (JobTracker, Oozie, etc.) use configurations to keep track of the different contexts for each user. You could go to a dependency injection approach based on Guice to make it pluggable and yet context sensitive. -- Owen