I have been using shelving the same way I use stashing in Git. I need to put my current work aside in order to fix something else first. Once this fix has been made, I can resume where I was.
This fix could be a critical bug fix (I say 'could be', because I have never actually had to, but it would be a valid reason). Rather, I have mostly done this because I identified a refactoring that should be made. I would never work on both the refactoring, and the new feature on the same time, and check them in in the same changeset. I would always first implement the refactoring, check that in, and then work on the feature/functionality, and then check that in.
In regards to a lot of the other answers about using shelves as a backup measure, I wouldn't bother. In the 20+ years I have owned computers, I have only experience a hard disk crash once, and that was because I pulled it out of the computer while it was still turned on (and I still managed to salvage the data by replacing the print board). So if this unlikely event really should happen, how much work would you have to recreate? If it is a significant amount, then I would say that your change-sets are too large.
So even though there is nothing wrong with creating a shelve for backup purposes, I just wouldn't bother.