Roy has a mini-rant about the use of undocumented features:
"Don't people get that if you use something the way it wasnt supposed to be used, you can get unexpected results, not to mention crashing and other stuff. this is just the kind of stuff VB6 developers were afarid of when trying to do multithreading using API calls. You just [can't] trust it enough to put it in production."
Two points to counter this. First, production code isn't production code without a battery of tests to support it. Whether the code you're calling into is documented or not shouldn't affect your desire to write tests against it. Whether the API you use is "public" or not doesn't mean it is more or less robust than anything else. Sure, public APIs may have been excercised more thoroughly, but in the context of any particular application, the reliable functionality of any code should be defined by the tests it passes.
Second, there is a whole group of applications which relies on this "edge" functionality, namely, tools. I recently wrote a testing tool for ASP.Net which relied on undocumented calls into System.Web classes to do its work, and a method interception tool which has to do all sorts of crazy stuff with metadata and bytecode. Lutz Roeder has written a bunch of incredible tools which excercise the darkest corners of .Net. John Lam likewise, with AOP. There is always a fight between the developers of a framework/language needing to draw a line under the functionality they can support, and pioneering users needing to push the boundaries.