What I never fully understood is why the staging area isn't simply a commit that gets amended repeatedly as files are staged into it. Maybe just a tree pointer, since the rest of the commit data isn't available until commit, but you could fill in some placeholders. ("(staging)" for the message, current times for the timestamps, etc.)
(Note that index doubles for other functions like merging/conflict resolution, but I never thought that was a good thing, and could be separated out.)