diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Changelog
 
+## 0.3.0.0
+
+*  Generalize Snap to MonadSnap, thanks to theNerd247!
+
 #### 0.2.0.1
 
 * Allow rest-core-0.39.
diff --git a/rest-snap.cabal b/rest-snap.cabal
--- a/rest-snap.cabal
+++ b/rest-snap.cabal
@@ -1,5 +1,5 @@
 name:                rest-snap
-version:             0.2.0.1
+version:             0.3.0.0
 description:         Rest driver for Snap.
 synopsis:            Rest driver for Snap.
 maintainer:          code@silk.co
@@ -28,7 +28,7 @@
     , case-insensitive >= 0.4 && < 1.3
     , rest-core >= 0.34 && < 0.40
     , safe >= 0.2 && < 0.4
-    , snap-core == 0.9.*
+    , snap-core >= 0.9 && < 1.1
     , unordered-containers == 0.2.*
     , uri-encode == 1.5.*
     , utf8-string >= 0.3 && < 1.1
diff --git a/src/Rest/Driver/Snap.hs b/src/Rest/Driver/Snap.hs
--- a/src/Rest/Driver/Snap.hs
+++ b/src/Rest/Driver/Snap.hs
@@ -1,8 +1,13 @@
 {-# OPTIONS_GHC -fno-warn-orphans #-}
 {-# LANGUAGE
-    NoImplicitPrelude
+    CPP
+  , GeneralizedNewtypeDeriving
+  , NoImplicitPrelude
   , RankNTypes
   #-}
+#if MIN_VERSION_base(4,9,0)
+{-# OPTIONS_GHC -Wno-redundant-constraints #-}
+#endif
 module Rest.Driver.Snap
   ( apiToHandler
   , apiToHandler'
@@ -28,21 +33,24 @@
 import qualified Rest.Driver.Types as Rest
 import qualified Rest.Run          as Rest
 
-apiToHandler :: Api Snap -> Snap ()
+newtype Snapped m a = Snapped { unSnapped :: m a }
+  deriving (Applicative, Functor, Monad)
+
+apiToHandler :: (MonadSnap m, Rest m, Applicative m, Monad m) => Api m -> m ()
 apiToHandler = apiToHandler' id
 
-apiToHandler' :: (Applicative m, Monad m) => Run m Snap -> Api m -> Snap ()
-apiToHandler' run api = Rest.apiToHandler' run api >>= writeLBS
+apiToHandler' :: (Applicative m, Monad m, MonadSnap n) => Run m n -> Api m -> n ()
+apiToHandler' run api = writeLBS =<< unSnapped (Rest.apiToHandler' (Snapped . run) api)
 
-instance Rest Snap where
-  getHeader nm       = getsRequest (fmap UTF8.toString . Snap.getHeader (CI.mk . UTF8.fromString $ nm))
-  getParameter  nm   = getsRequest (fmap UTF8.toString . (>>= headMay) . rqParam (UTF8.fromString nm))
-  getBody            = readRequestBody (1 * 1024 * 1024)
-  getMethod          = getsRequest (toRestMethod . rqMethod)
-  getPaths           = getsRequest (map (UTF8.toString . URI.decodeByteString) . filter (not . Char8.null) . Char8.split '/' . rqPathInfo)
-  lookupMimeType     = return . fmap UTF8.toString . flip M.lookup defaultMimeTypes
-  setHeader nm v     = modifyResponse (Snap.setHeader (CI.mk . UTF8.fromString $ nm) (UTF8.fromString v))
-  setResponseCode cd = modifyResponse (Snap.setResponseCode cd)
+instance (MonadSnap m) => Rest (Snapped m) where
+  getHeader nm       = Snapped $ getsRequest (fmap UTF8.toString . Snap.getHeader (CI.mk . UTF8.fromString $ nm))
+  getParameter  nm   = Snapped $ getsRequest (fmap UTF8.toString . (>>= headMay) . rqParam (UTF8.fromString nm))
+  getBody            = Snapped $ readRequestBody (1 * 1024 * 1024)
+  getMethod          = Snapped $ getsRequest (toRestMethod . rqMethod)
+  getPaths           = Snapped $ getsRequest (map (UTF8.toString . URI.decodeByteString) . filter (not . Char8.null) . Char8.split '/' . rqPathInfo)
+  lookupMimeType     = Snapped . return . fmap UTF8.toString . flip M.lookup defaultMimeTypes
+  setHeader nm v     = Snapped $ modifyResponse (Snap.setHeader (CI.mk . UTF8.fromString $ nm) (UTF8.fromString v))
+  setResponseCode cd = Snapped $ modifyResponse (Snap.setResponseCode cd)
 
 toRestMethod :: Snap.Method -> Maybe Rest.Method
 toRestMethod Snap.GET    = Just Rest.GET
