Also anywhere you accept a class name (which you should *only* do if you deliberately are supporting a user-defined type), you should accept a module name as well.

If your class is actually predefined in your subsystem as something that is expected to be commonly used, you should have a specific, strongly-typed subresource for it instead of having a generic "map" of key/value pairs.  This will decouple the configuration interface from the code, and make it possible for you to do refactors in the future without having to break user configuration, or perform nasty translation schemes.