diff --git a/concurrent-state.cabal b/concurrent-state.cabal
--- a/concurrent-state.cabal
+++ b/concurrent-state.cabal
@@ -1,5 +1,5 @@
 name:                concurrent-state
-version:             0.3.0.0
+version:             0.3.1.0
 synopsis:            MTL-like library using TVars
 description:         State and Writer backed by TVars.
 homepage:            https://github.com/joelteon/concurrent-state
diff --git a/src/Control/Monad/State/Concurrent/Lazy.hs b/src/Control/Monad/State/Concurrent/Lazy.hs
--- a/src/Control/Monad/State/Concurrent/Lazy.hs
+++ b/src/Control/Monad/State/Concurrent/Lazy.hs
@@ -77,12 +77,13 @@
         _runStateC (k a) s'
 
 instance (Functor m, MonadIO m) => MonadState s (StateC s m) where
-    get = StateC $ \s -> do
-        m <- liftIO (readTVarIO s)
-        return (m, s)
-    put s = StateC $ \tv -> do
-        liftIO . atomically $ swapTVar tv s
-        return ((), tv)
+    state f = StateC $ \tv -> do
+        newval <- liftIO . atomically $ do
+            old <- readTVar tv
+            let ~(a, s) = f old
+            swapTVar tv s
+            return a
+        return (newval, tv)
 
 instance (MonadIO m, MonadFix m) => MonadFix (StateC s m) where
     mfix f = StateC $ \s -> mfix $ \ ~(a, _) -> _runStateC (f a) s
diff --git a/src/Control/Monad/State/Concurrent/Strict.hs b/src/Control/Monad/State/Concurrent/Strict.hs
--- a/src/Control/Monad/State/Concurrent/Strict.hs
+++ b/src/Control/Monad/State/Concurrent/Strict.hs
@@ -78,12 +78,13 @@
         _runStateC (k a) s'
 
 instance (Functor m, MonadIO m) => MonadState s (StateC s m) where
-    get = StateC $ \s -> do
-        m <- liftIO (readTVarIO s)
-        return (m, s)
-    put s = StateC $ \tv -> do
-        liftIO . atomically $ swapTVar tv s
-        return ((), tv)
+    state f = StateC $ \tv -> do
+        newval <- liftIO . atomically $ do
+            old <- readTVar tv
+            let (a, s) = f old
+            swapTVar tv s
+            return a
+        return (newval, tv)
 
 instance (MonadIO m, MonadFix m) => MonadFix (StateC s m) where
     mfix f = StateC $ \s -> mfix $ \(a, _) -> _runStateC (f a) s
