diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,7 @@
+0.5.1.1
+-------
+* Specialize `get' for StateC and RWSC to avoid an STM transaction
+
 0.5.1.0
 -------
 * Remove `Monoid w` constraint from MonadFork instances for RWS
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.5.1.0
+version:             0.5.1.1
 synopsis:            MTL-like library using TVars
 description:         State, RWS backed by TVar.
 homepage:            https://github.com/joelteon/concurrent-state
diff --git a/src/Control/Monad/RWS/Concurrent/Lazy.hs b/src/Control/Monad/RWS/Concurrent/Lazy.hs
--- a/src/Control/Monad/RWS/Concurrent/Lazy.hs
+++ b/src/Control/Monad/RWS/Concurrent/Lazy.hs
@@ -100,6 +100,9 @@
         return (a, s', tw')
 
 instance (MonadIO m, MonadState s m) => MonadState s (RWSC r w s m) where
+    get = RWSC $ \_ tv w -> do
+        s <- liftIO $ readTVarIO tv
+        return (s, tv, w)
     state f = RWSC $ \_ tv w -> do
         newval <- liftIO . atomically $ do
             old <- readTVar tv
diff --git a/src/Control/Monad/RWS/Concurrent/Strict.hs b/src/Control/Monad/RWS/Concurrent/Strict.hs
--- a/src/Control/Monad/RWS/Concurrent/Strict.hs
+++ b/src/Control/Monad/RWS/Concurrent/Strict.hs
@@ -100,6 +100,9 @@
         return (a, s', tw')
 
 instance (MonadIO m, MonadState s m) => MonadState s (RWSC r w s m) where
+    get = RWSC $ \_ tv w -> do
+        s <- liftIO $ readTVarIO tv
+        return (s, tv, w)
     state f = RWSC $ \_ tv w -> do
         newval <- liftIO . atomically $ do
             old <- readTVar tv
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
@@ -85,6 +85,9 @@
         _runStateC (k a) s'
 
 instance (Functor m, MonadIO m) => MonadState s (StateC s m) where
+    get = StateC $ \tv -> do
+        s <- liftIO $ readTVarIO tv
+        return (s, tv)
     state f = StateC $ \tv -> do
         newval <- liftIO . atomically $ do
             old <- readTVar tv
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
@@ -86,6 +86,9 @@
         _runStateC (k a) s'
 
 instance (Functor m, MonadIO m) => MonadState s (StateC s m) where
+    get = StateC $ \tv -> do
+        s <- liftIO $ readTVarIO tv
+        return (s, tv)
     state f = StateC $ \tv -> do
         newval <- liftIO . atomically $ do
             old <- readTVar tv
