I think state of mind is a good way to define contexts. I have a lot of contexts that exist purely because once I start doing one of those tasks, the easiest thing for me to do is to continue with other similar ones. They tend to use the same mental processes and materials. Examples are:
@Calls, @Chores, @Brainstorm, @DIY, @Paperwork
@Brainstorm and @DIY are on opposite ends of a spectrum. With @Brainstorm, it's all about mental state. Once I get going in the right mindset, I just keep feeding off the buzz created by the awesome ideas I've just had and end up being really productive.
With @DIY, on the other hand, once I've got my drill, screwdriver and hammer out, and while I'm covered in dust, I might as well crank through the rest of my DIY actions.
Another category of context I use is for large projects that involve a lot of work of mainly the same kind of action. For example: @Code Work Project A, @Code Work Project B, @Code Hobby Project, @Thesis. There is research showing that, especially for programming, the mental overhead of getting back into working on a project is such that it is horribly inefficient to go at it in short bursts, or even to be interrupted. With contexts dedicated to these projects, it's one way to incorporate large, productive chunks of time into GTD where the only actions I am seeing are from the project I am working on and I'm not being distracted by seeing actions from other projects.
These ideas work for me. I Hope they help you!