The over-all system-documentation should be written BEFORE you start coding. It's much easier to talk about the design og the system when it's documented, it is easier to discover design-errors, and they are incredibly cheaper to fix.
And if there is a written system-design, every developer will have the same goal. Well, closer to, anyway.
And of course, if documentation is the first step (in stead of the last), you can't just drop it.
When it comes to the details (classes, methods etc.) I rely very much on self-documenting code. If you can't describe what a method does with a short name, it's probably too complicated. If not, add a bit of inline-documentation. (Javadoc or similar)
This forces good design a bit more, and it's much easier to have everything right there with code completion in your IDE, than long boring documents somewhere.
As a developer, I do NOT want detailed documentation AT ALL! If it is needed, don't write it. Fix the code! (Refactor)