Sorry if this feels more like a shameless plug than a review ... if you do not like to have to repeat the names of the exception classes to set up the hierarchy you might like Exception::Class::Nested. It's just a simple wrapper of this module that lets you describe the hierarchy by nesting the class definitions. This may prevent rather hard to debug typos :-)
I like to get a plain old data-structure out of the XML, the catch with XML:Simple is that the datastructure is either not consistent or too complicated. The ForceArray and other options go a long way to that goal, but not far enough. For example tags with optional attributes still cause problems.
You may have a look at perlmonks.org/?node_id=697036 to see an alternative.
(This is not really a review, rather a response to Eamons review.)
What's the advantage over URI::Escape? The fact that it accepts hashes. So that you do not have to loop through the hash yourself and (as you seem to suggest) fail to escape the data properly. You seem to want to merge all the data separated by =s and &s and then run the uri_escape() for the whole string you build. THAT IS WRONG! What if any of the values contains a &?!?
Also, any value of the hash may be an arrayref, in which case you end up with foo=firstvalue&foo=secondvalue&foo=thirdvalue&... This firther adds to the complexity if you wanted to implement it yourself.
If you want to trace the calls of your subroutines it's IMHO better to use something like Devel::TraceSubs as it allows you to add/remove the loggin without haveing to make any changes to the traced subroutines.