In moving from hg to svn, this is the feature that I most miss. It is crucial in promoting smaller, single-purposed commits and good code structure. For example, it allows you see some smaller refactoring that should be done to make the feature you are working on cleaner, put your unfinished feature aside, refactor and test your code cleanly, commit, and then resume building your feature.
I'm frustrated with those who have suggested storing your shelved code to the (remote) repository, as I think it muddies the waters and makes the feature seem harder. If you want to share your code or make sure its preserved, a branch is a great place for that. Shelving is supposed to be lighter and faster, for code that is not ready for anyone else to see.
I have seen shelve implementations without it, but I think shelving is greatly enhanced by each shelf having a name. This allows you to put off several unfinished efforts, and then select which one you want to pick back up. I don't see a stack-like implementation as being as useful, since I may not want to resume work on the last shelf I worked on, even though I do not wart to discard it.