diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,10 @@
 # Revision history for rhine-gloss
 
+## 0.7.0
+
+* Reworked `gloss` backends.
+  There are now two pure backends and an `IO` backend.
+
 ## 0.4.0.0 -- 2017.12.04
 
 * Version bump
diff --git a/rhine-gloss.cabal b/rhine-gloss.cabal
--- a/rhine-gloss.cabal
+++ b/rhine-gloss.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                rhine-gloss
-version:             0.8.1
+version:             0.8.1.1
 synopsis:            Gloss backend for Rhine
 description:
   This package provides a simple wrapper for the `gloss` library,
@@ -26,7 +26,7 @@
 source-repository this
   type:     git
   location: https://github.com/turion/rhine.git
-  tag:      v0.8.1
+  tag:      v0.8.1.1
 
 
 library
@@ -36,13 +36,16 @@
     FRP.Rhine.Gloss.IO
     FRP.Rhine.Gloss.Pure
     FRP.Rhine.Gloss.Pure.Combined
-  build-depends:       base         >= 4.11 && < 4.17
+  build-depends:       base         >= 4.14 && < 4.18
                      , transformers >= 0.5
-                     , rhine        == 0.8.1
+                     , rhine        == 0.8.1.1
                      , dunai        >= 0.8
                      , gloss        >= 1.12
+                     , mmorph       >= 1.1
   hs-source-dirs:      src
   default-language:    Haskell2010
+  default-extensions:
+      TypeOperators
   ghc-options:         -W
   if flag(dev)
     ghc-options: -Werror
@@ -50,7 +53,7 @@
 executable rhine-gloss-gears
   main-is:             Main.hs
   ghc-options:         -threaded
-  build-depends:       base         >= 4.9 && < 5
+  build-depends:       base         >= 4.14 && < 4.18
                      , rhine-gloss
   default-language:    Haskell2010
   ghc-options:         -W -threaded -rtsopts -with-rtsopts=-N
diff --git a/src/FRP/Rhine/Gloss/IO.hs b/src/FRP/Rhine/Gloss/IO.hs
--- a/src/FRP/Rhine/Gloss/IO.hs
+++ b/src/FRP/Rhine/Gloss/IO.hs
@@ -28,6 +28,9 @@
 import Control.Monad.Trans.Class
 import Control.Monad.Trans.Reader
 
+-- mmorph
+import Control.Monad.Morph
+
 -- gloss
 import Graphics.Gloss.Interface.IO.Game
 
@@ -44,7 +47,7 @@
 -- | Wraps the concurrent variables needed for communication with the @gloss@ backend.
 newtype GlossConcT m a = GlossConcT
   { unGlossConcT :: ReaderT GlossEnv m a }
-  deriving (Functor, Applicative, Monad, MonadTrans, MonadIO)
+  deriving (Functor, Applicative, Monad, MonadTrans, MonadIO, MFunctor, MMonad)
 
 withPicRef
   :: MonadIO m
@@ -134,21 +137,21 @@
 -- | Run a 'Rhine' in the 'GlossConcT' monad by launching a separate thread for the @gloss@ backend,
 --   and reactimate in the foreground.
 flowGlossIO
-  :: ( Clock (GlossConcT IO) cl
+  :: ( MonadIO m
+     , Clock (GlossConcT m) cl
      , GetClockProxy cl
      , Time cl ~ Time (In  cl)
      , Time cl ~ Time (Out cl)
      )
   => GlossSettings
-  -> Rhine (GlossConcT IO) cl () ()
-  -> IO ()
+  -> Rhine (GlossConcT m) cl () ()
+  -> m ()
 flowGlossIO settings = launchGlossThread settings . flow
 
 -- | A schedule in the 'GlossConcT' transformer,
 --   supplying the same backend connection to its scheduled clocks.
 glossConcurrently
-  :: ( Monad IO
-     , Clock (GlossConcT IO) cl1, Clock (GlossConcT IO) cl2
+  :: ( Clock (GlossConcT IO) cl1, Clock (GlossConcT IO) cl2
      , Time cl1 ~ Time cl2
      )
   => Schedule (GlossConcT IO) cl1 cl2
