Solved - turned out to be an issue on the Cassandra side.
For the benefit of the list, in case anyone is Googling and has the same problem...
I've followed the workaround of disabling the key cache to workaround the issue until there's a fix. For anyone following that workaround - you'll need to update your schema to disable the key cache to start with, then run nodetool invalidatekeycache to make sure anything current cached on each node is evicted before the changes take effect. Also, if your app is still running and has pooled connections that have received TimedOutExceptions previously, you'll need to reload it as those connections will be hanging around in a bad state.
James.