I find that for most software projects, documentation is often oriented towards the process of development the software, rather than supporting and maintaining it. This is particularly true when using agile methodologies, which emphasize minimalistic documentation.
The issue with development-oriented documentation is that it tends to be less usable as a reference, especially after a few releases. It's a pain to sifting through a pile of story cards (or story pages on a wiki, as our team uses) trying to work out which stories are current, and which have been modified (directly or indirectly) by more recent stories. A full waterfall-style requirements specification, technical-design document, etc. may be fine if development is always done in a big bang, but as bugs are fixed, minor features added, etc. it may be difficult to maintain.
I'm a fan of minimalistic documentation, as the less documentation there is, the easier it is to find things (assuming what you're looking for is documented, of course), and the easier it is to maintain.
I am thinking of extending our wiki-based story pages to contain some meta-data, i.e. references to other stories which are related, affected, obsoleted, etc., similar to IETF RFPs.
I'm interested in hearing about other peoples' experiences with lightweight approaches to software documentation that works for maintenance and support, not just delivering a project and tossing it over the wall.
Update: I don't consider class-level documentation to be enough, whether using inline documentation such as javadoc or unit tests as documentation. These are fine for developers, but testers, support staff, trainers and the like need a way to understand what the expected behavior of the code is. This needs a higher level view of functionality than class-by-class. Each class may be doing what it was meant to do, but is how is the component as a whole supposed to work? This is why I personally favor the user story as a basic unit of documentation.