diff --git a/src/Data/Predicate.hs b/src/Data/Predicate.hs
--- a/src/Data/Predicate.hs
+++ b/src/Data/Predicate.hs
@@ -6,6 +6,7 @@
 
 module Data.Predicate
     ( Predicate
+    , module Data.Predicate.Result
     , constant
     , failure
     , true
@@ -23,7 +24,6 @@
     , mapFail
     , exec
     , module Data.Predicate.Product
-    , module Data.Predicate.Result
     ) where
 
 import Control.Monad
diff --git a/src/Data/Predicate/Result.hs b/src/Data/Predicate/Result.hs
--- a/src/Data/Predicate/Result.hs
+++ b/src/Data/Predicate/Result.hs
@@ -8,6 +8,8 @@
 
 import Control.Applicative
 import Control.Monad
+import Control.Monad.Trans.Class
+import Control.Monad.IO.Class
 
 -- | A 'Bool'-like type where each branch--@Fail@ and @Okay@--carries
 -- some metadata.
@@ -33,6 +35,12 @@
 result f _ (Fail   x) = f x
 result _ g (Okay d x) = g d x
 
+fromEither :: Either f t -> Result f t
+fromEither = either Fail return
+
+toEither :: Result f t -> Either f t
+toEither = result Left (\_ x -> Right x)
+
 newtype ResultT f m t = ResultT { runResultT :: m (Result f t) }
 
 instance Monad m => Functor (ResultT f m) where
@@ -43,20 +51,35 @@
     (<*>) = ap
 
 instance Monad m => Monad (ResultT f m) where
-    return  = ResultT . return . Okay 0
+    return  = ResultT . return . return
     m >>= k = ResultT $ runResultT m >>= \a -> case a of
         Okay _ x -> runResultT (k x)
         Fail   x -> return (Fail x)
     fail = ResultT . fail
 
+instance MonadTrans (ResultT f) where
+    lift = ResultT . liftM return
+
+instance MonadIO m => MonadIO (ResultT f m) where
+    liftIO = lift . liftIO
+
 resultT :: Monad m => (f -> m a) -> (Double -> t -> m a) -> ResultT f m t -> m a
 resultT f g (ResultT m) = m >>= \a -> case a of
     Fail   x -> f x
     Okay d x -> g d x
 
+resultT' :: Monad m => (f -> m a) -> (t -> m a) -> ResultT f m t -> m a
+resultT' f g = resultT f (\_ x -> g x)
+
 mapResultT :: (m (Result f t) -> n (Result f' t')) -> ResultT f m t -> ResultT f' n t'
 mapResultT f m = ResultT $ f (runResultT m)
 
 hoistResult :: Monad m => Result f t -> ResultT f m t
 hoistResult = ResultT . return
+
+okay :: Monad m => Double -> t -> ResultT f m t
+okay d = hoistResult . Okay d
+
+throwF :: Monad m => f -> ResultT f m t
+throwF = hoistResult . Fail
 
diff --git a/src/Network/Wai/Predicate.hs b/src/Network/Wai/Predicate.hs
--- a/src/Network/Wai/Predicate.hs
+++ b/src/Network/Wai/Predicate.hs
@@ -6,7 +6,7 @@
 
 module Network.Wai.Predicate
     ( module Data.Predicate
-    , getRequest
+    , request
 
     , query
     , hasQuery
@@ -43,8 +43,8 @@
 import Network.Wai.Predicate.Utility
 import Network.Wai
 
-getRequest :: (HasRequest r) => Predicate r f Request
-getRequest = return . request
+request :: (HasRequest r) => Predicate r f Request
+request = return . getRequest
 
 query :: (HasQuery r, FromByteString a) => ByteString -> Predicate r Error a
 query k r = case lookupQuery k r of
diff --git a/src/Network/Wai/Predicate/Error.hs b/src/Network/Wai/Predicate/Error.hs
--- a/src/Network/Wai/Predicate/Error.hs
+++ b/src/Network/Wai/Predicate/Error.hs
@@ -7,7 +7,7 @@
 import Data.ByteString (ByteString)
 import Network.HTTP.Types.Status
 
--- | The error type used as meta-data for @F@ in all WAI predicates.
+-- | The error type used as meta-data for @Fail@ in all WAI predicates.
 data Error = Error
     { status  :: !Status          -- ^ HTTP status code
     , message :: Maybe ByteString -- ^ optional status message
diff --git a/src/Network/Wai/Predicate/Request.hs b/src/Network/Wai/Predicate/Request.hs
--- a/src/Network/Wai/Predicate/Request.hs
+++ b/src/Network/Wai/Predicate/Request.hs
@@ -34,7 +34,7 @@
 import qualified Data.Vector     as Vec
 
 class HasRequest a where
-    request :: a -> Wai.Request
+    getRequest :: a -> Wai.Request
 
 class HasMethod a where
     method :: a -> Method
@@ -58,22 +58,22 @@
     }
 
 instance HasRequest Req where
-    request = _request
+    getRequest = _request
 
 instance HasMethod Req where
-    method = Wai.requestMethod . request
+    method = Wai.requestMethod . getRequest
 
 instance HasMethod Wai.Request where
     method = Wai.requestMethod
 
 instance HasHeaders Req where
-    headers = Wai.requestHeaders . request
+    headers = Wai.requestHeaders . getRequest
 
 instance HasHeaders Wai.Request where
     headers = Wai.requestHeaders
 
 instance HasQuery Req where
-    queryItems = Wai.queryString . request
+    queryItems = Wai.queryString . getRequest
 
 instance HasQuery Wai.Request where
     queryItems = Wai.queryString
diff --git a/wai-predicates.cabal b/wai-predicates.cabal
--- a/wai-predicates.cabal
+++ b/wai-predicates.cabal
@@ -1,5 +1,5 @@
 name:                wai-predicates
-version:             0.1
+version:             0.2
 synopsis:            WAI request predicates
 license:             OtherLicense
 license-file:        LICENSE
@@ -53,6 +53,7 @@
       , cookie           == 0.4.*
       , case-insensitive == 1.1.*
       , http-types       == 0.8.*
+      , transformers     == 0.3.*
       , vector           == 0.10.*
       , wai              == 2.0.*
 
