...The rule is that whenever possible, forget about Stateful beans (for obvious reasons, like allocating precious resources to just one client instead of sharing them...)
but there are cases you will need them, like:
1) You want to maintain the transaction open during subsequent calls. Regarding this i was reading a while back, an example of an airline booking. If you plan to book 3 flights, and you want those flights to either be booked all together, otherwise the transaction should fail, then you need a Stateful bean, so you can rollback the transaction in case of problems (you can keep the transaction open between method calls using an extended persistent context)
2) As you mentioned, to keep state between calls, i.e. a shopping cart
3) You need a Stateful session bean if you want to implement the SessionSynchronization interface. The reason you may want to implement it is in the case as you mentioned when you have a Servlet. If you access the HTTPsession to set your own variables, you might need to use SessionSynchronization to keep those calls consistent. You can read how it works
here.
Dave