diff --git a/jsaddle.cabal b/jsaddle.cabal
--- a/jsaddle.cabal
+++ b/jsaddle.cabal
@@ -1,5 +1,5 @@
 name: jsaddle
-version: 0.5.1.0
+version: 0.5.1.1
 cabal-version: >=1.10
 build-type: Simple
 license: MIT
@@ -39,6 +39,7 @@
             filepath >=1.4.0.0 && <1.5,
             http-types >=0.8.6 && <0.10,
             process >=1.2.3.0 && <1.5,
+            ref-tf >=0.4.0.1 && <0.5,
             stm >=2.4.4 && <2.5,
             time >=1.5.0.1 && <1.7,
             wai >=3.0.3.0 && <3.3,
diff --git a/src/Language/Javascript/JSaddle/Types.hs b/src/Language/Javascript/JSaddle/Types.hs
--- a/src/Language/Javascript/JSaddle/Types.hs
+++ b/src/Language/Javascript/JSaddle/Types.hs
@@ -1,8 +1,12 @@
 {-# LANGUAGE CPP                        #-}
-{-# LANGUAGE FlexibleInstances          #-}
+#ifdef ghcjs_HOST_OS
+{-# LANGUAGE ConstraintKinds            #-}
+#else
+{-# LANGUAGE TypeFamilies               #-}
+{-# LANGUAGE UndecidableInstances       #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE DeriveGeneric              #-}
-{-# LANGUAGE ConstraintKinds            #-}
+#endif
 -----------------------------------------------------------------------------
 --
 -- Module      :  Language.Javascript.JSaddle.Types
@@ -46,7 +50,6 @@
 #endif
 ) where
 
-import Control.Monad.Trans.Reader (ReaderT(..))
 import Control.Monad.IO.Class (MonadIO(..))
 #ifdef ghcjs_HOST_OS
 import GHCJS.Types
@@ -55,15 +58,20 @@
 import Data.Word (Word(..))
 import GHCJS.Nullable (Nullable(..))
 #else
+import Control.Monad.Trans.Reader (ReaderT(..))
+import Control.Monad.Trans.State.Lazy (StateT(..))
+import qualified Control.Monad.Trans.State.Strict as Strict
+       (StateT(..))
 import Control.Monad.Trans.Class (MonadTrans(..))
+import Control.Monad.Fix (MonadFix)
+import Control.Monad.Ref (MonadAtomicRef(..), MonadRef(..))
+import Control.Concurrent.STM.TVar (TVar)
 import Data.Int (Int64)
 import Data.Text (Text)
 import Data.Time.Clock (UTCTime(..))
 import Data.Aeson
        (defaultOptions, genericToEncoding, ToJSON(..), FromJSON(..))
 import GHC.Generics (Generic)
-import Control.Concurrent.STM.TVar (TVar)
-import Control.Monad.Fix (MonadFix)
 #endif
 
 -- | Identifies a JavaScript execution context.
@@ -116,6 +124,23 @@
 instance MonadJSM m => MonadJSM (ReaderT e m) where
     liftJSM' = lift . liftJSM'
     {-# INLINE liftJSM' #-}
+
+instance MonadJSM m => MonadJSM (StateT r m) where
+    liftJSM' = lift . liftJSM'
+    {-# INLINE liftJSM' #-}
+
+instance MonadJSM m => MonadJSM (Strict.StateT r m) where
+    liftJSM' = lift . liftJSM'
+    {-# INLINE liftJSM' #-}
+
+instance MonadRef JSM where
+    type Ref JSM = Ref IO
+    newRef = liftIO . newRef
+    readRef = liftIO . readRef
+    writeRef r = liftIO . writeRef r
+
+instance MonadAtomicRef JSM where
+    atomicModifyRef r = liftIO . atomicModifyRef r
 #endif
 
 -- | The 'liftJSM' is to 'JSM' what 'liftIO' is to 'IO'.
