diff --git a/FreeGame.hs b/FreeGame.hs
--- a/FreeGame.hs
+++ b/FreeGame.hs
@@ -41,6 +41,7 @@
     bitmapSize,
     readBitmap,
     cropBitmap,
+    clipBitmap,
     loadBitmaps,
     loadBitmapsWith,
     writeBitmap,
diff --git a/FreeGame/Data/Bitmap.hs b/FreeGame/Data/Bitmap.hs
--- a/FreeGame/Data/Bitmap.hs
+++ b/FreeGame/Data/Bitmap.hs
@@ -22,9 +22,9 @@
 
     -- * Bitmap operations
     ,cropBitmap
+    ,clipBitmap
     -- * V2
     ,sizeBitmap
-    ,clipBitmap
     ) where
 
 import qualified Codec.Picture as C
@@ -36,7 +36,7 @@
 import Control.Applicative
 import Data.Hashable
 
-data Bitmap = Bitmap (C.Image C.PixelRGBA8) Int
+data Bitmap = Bitmap { bitmapImage :: C.Image C.PixelRGBA8, bitmapHash :: Int }
 
 -- | Get the size of the 'Bitmap'.
 bitmapSize :: Bitmap -> (Int, Int)
diff --git a/FreeGame/Instances.hs b/FreeGame/Instances.hs
--- a/FreeGame/Instances.hs
+++ b/FreeGame/Instances.hs
@@ -9,7 +9,11 @@
 import Control.Monad.Trans.Cont
 import Control.Monad.Trans.Maybe
 import Control.Monad.Trans.List
+#if MIN_VERSION_transformers(0,4,0)
+import Control.Monad.Trans.Except
+#else
 import Control.Monad.Trans.Error
+#endif
 import Control.Monad.Trans.Identity
 import qualified Control.Monad.State.Lazy as Lazy
 import qualified Control.Monad.State.Strict as Strict
@@ -97,7 +101,11 @@
 MK_AFFINE(_COMMA_ Monad m, IdentityT m, mapIdentityT)
 MK_AFFINE(_COMMA_ Monad m, MaybeT m, mapMaybeT)
 MK_AFFINE(_COMMA_ Monad m, ListT m, mapListT)
+#if MIN_VERSION_transformers(0,4,0)
+MK_AFFINE(_COMMA_ Monad m, ExceptT e m, mapExceptT)
+#else
 MK_AFFINE(_COMMA_ Monad m _COMMA_ Error e, ErrorT e m, mapErrorT)
+#endif
 MK_AFFINE(_COMMA_ Monad m, ContT r m, mapContT)
 
 MK_PICTURE_2D(_COMMA_ Functor m, F m, Church.liftF, hoistF)
@@ -113,7 +121,11 @@
 MK_PICTURE_2D(_COMMA_ Monad m, IdentityT m, lift, mapIdentityT)
 MK_PICTURE_2D(_COMMA_ Monad m, MaybeT m, lift, mapMaybeT)
 MK_PICTURE_2D(_COMMA_ Monad m, ListT m, lift, mapListT)
+#if MIN_VERSION_transformers(0,4,0)
+MK_PICTURE_2D(_COMMA_ Monad m, ExceptT e m, lift, mapExceptT)
+#else
 MK_PICTURE_2D(_COMMA_ Monad m _COMMA_ Error e, ErrorT e m, lift, mapErrorT)
+#endif
 MK_PICTURE_2D(_COMMA_ Monad m, ContT r m, lift, mapContT)
 
 MK_LOCAL(_COMMA_ Functor m, F m, Church.liftF)
@@ -129,7 +141,11 @@
 MK_LOCAL(_COMMA_ Monad m, IdentityT m, lift)
 MK_LOCAL(_COMMA_ Monad m, MaybeT m, lift)
 MK_LOCAL(_COMMA_ Monad m, ListT m, lift)
+#if MIN_VERSION_transformers(0,4,0)
+MK_LOCAL(_COMMA_ Monad m, ExceptT e m, lift)
+#else
 MK_LOCAL(_COMMA_ Monad m _COMMA_ Error e, ErrorT e m, lift)
+#endif
 MK_LOCAL(_COMMA_ Monad m, ContT r m, lift)
 
 MK_KEYBOARD(_COMMA_ Functor m, F m, Church.liftF)
@@ -145,7 +161,11 @@
 MK_KEYBOARD(_COMMA_ Monad m, IdentityT m, lift)
 MK_KEYBOARD(_COMMA_ Monad m, MaybeT m, lift)
 MK_KEYBOARD(_COMMA_ Monad m, ListT m, lift)
+#if MIN_VERSION_transformers(0,4,0)
+MK_KEYBOARD(_COMMA_ Monad m, ExceptT e m, lift)
+#else
 MK_KEYBOARD(_COMMA_ Monad m _COMMA_ Error e, ErrorT e m, lift)
+#endif
 MK_KEYBOARD(_COMMA_ Monad m, ContT r m, lift)
 
 MK_MOUSE(_COMMA_ Functor m, F m, liftF)
@@ -161,7 +181,11 @@
 MK_MOUSE(_COMMA_ Monad m, IdentityT m, lift)
 MK_MOUSE(_COMMA_ Monad m, MaybeT m, lift)
 MK_MOUSE(_COMMA_ Monad m, ListT m, lift)
+#if MIN_VERSION_transformers(0,4,0)
+MK_MOUSE(_COMMA_ Monad m, ExceptT e m, lift)
+#else
 MK_MOUSE(_COMMA_ Monad m _COMMA_ Error e, ErrorT e m, lift)
+#endif
 MK_MOUSE(_COMMA_ Monad m, ContT r m, lift)
 
 MK_FROM_FINALIZER(_COMMA_ Functor m, F m, liftF)
@@ -176,7 +200,11 @@
 MK_FROM_FINALIZER(_COMMA_ Monad m, IdentityT m, lift)
 MK_FROM_FINALIZER(_COMMA_ Monad m, MaybeT m, lift)
 MK_FROM_FINALIZER(_COMMA_ Monad m, ListT m, lift)
+#if MIN_VERSION_transformers(0,4,0)
+MK_FROM_FINALIZER(_COMMA_ Monad m, ExceptT e m, lift)
+#else
 MK_FROM_FINALIZER(_COMMA_ Monad m _COMMA_ Error e, ErrorT e m, lift)
+#endif
 MK_FROM_FINALIZER(_COMMA_ Monad m, ContT r m, lift)
 
 MK_FREE_GAME(_COMMA_ Functor m, F m, liftF)
@@ -191,5 +219,9 @@
 MK_FREE_GAME(_COMMA_ Monad m, IdentityT m, lift)
 MK_FREE_GAME(_COMMA_ Monad m, MaybeT m, lift)
 MK_FREE_GAME(_COMMA_ Monad m, ListT m, lift)
+#if MIN_VERSION_transformers(0,4,0)
+MK_FREE_GAME(_COMMA_ Monad m, ExceptT e m, lift)
+#else
 MK_FREE_GAME(_COMMA_ Monad m _COMMA_ Error e, ErrorT e m, lift)
-MK_FREE_GAME(_COMMA_ Monad m, ContT r m, lift)
+#endif
+MK_FREE_GAME(_COMMA_ Monad m, ContT r m, lift)
diff --git a/free-game.cabal b/free-game.cabal
--- a/free-game.cabal
+++ b/free-game.cabal
@@ -1,5 +1,5 @@
 name:                free-game
-version:             1.1.78
+version:             1.1.79
 synopsis:            Create games for free
 description:
     free-game defines a monad that integrates features to create 2D games.
@@ -62,9 +62,9 @@
     JuicyPixels,
     JuicyPixels-util == 0.1.*,
     linear >= 1.0 && < 2,
-    mtl >= 2.1,
+    mtl >= 2.1 && <3,
     OpenGL == 2.9.*,
-    OpenGLRaw == 1.4.*,
+    OpenGLRaw >= 1.3 && < 1.6,
     random == 1.*,
     reflection == 1.*,
     template-haskell,
