Hi Tom.
Pretty much anywhere in your program where you have a state, shared by multiple threads, and which's consistency gets more complex than the one that's operated by few atomic operations, you might get benefit from using STM.
For example, I have a web app that needs to operate fast (e.g. from memory), that's why it has few HashMaps used as a cache. Those HashMaps need to be consistent with each other, e.g. you need to modify them both simultaneously to keep data "synced" between them. STM solves this great, as each of HashMaps is wrapped by TMVar, so update just uses an STM transaction to update both of them.
While reads often need to read only one of these HashMaps, that's why putting all of them under single MVar would be a worse idea.
Hope this clarifies use-case a bit.