I've written a working deferred renderer. Currently, my g-buffer contains (amongst other things):

A 24/8 depth/stencil texture, in which is stored the usual post-projective scene depth.
An R32F eye-space Z value.

I use the eye-space Z value to reconstruct the original eye-space positions of fragments during
the lighting pass. It's literally the Z component taken from the eye-space position of the current
fragment, not normalized or otherwise transformed. I use the stencil buffer to restrict the influence
of lights (not as an optimization, but as an effect - grouping geometry and only applying lights to
certain geometry, etc).

This all works fine, but I sort of dislike that I'm storing two different depth values - it seems like I
should be able to get away with just one.

The eye-space depth value seems to be more useful than the post-projective value (as in, I
typically always want the eye-space depth value, and almost never the post-projective value).
I keep hearing that some people *only* store (possibly normalized) eye-space depth values
directly into the actual scene depth buffer (and somehow still have depth testing work correctly),
but can't seem to find any clear information on how this is achieved. It seems like it'd be far more
useful to store this value rather than the post-projective value.

What are my options here? I'm targeting OpenGL 3.1 without extensions, if that makes a difference.