diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,19 +1,23 @@
+0.3.1
+-----------------------------------------------------------------------------
+- Add `fromVault` predicate and `HasVault` type-class.
+
 0.3
----
+-----------------------------------------------------------------------------
 - Change `header`, `hasHeader` and `lookupHeader` to use `HeaderName` instead
   of `ByteString` for the lookup key.
 
 0.2.1
------
+-----------------------------------------------------------------------------
 - Update WAI version bounds to include 2.1
 
 0.2
----
+-----------------------------------------------------------------------------
 - Rename `getRequest` predicate to `request` and `request` method of
   `HasRequest` to `getRequest`.
 - Add `MonadTrans` and `MonadIO` instance declarations for `ResultT` and
   some helper functions.
 
 0.1
----
+-----------------------------------------------------------------------------
 - Initial release.
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
@@ -22,6 +22,9 @@
 
     , accept
     , contentType
+
+    , fromVault
+
     , module Network.Wai.Predicate.MediaType
     , module Network.Wai.Predicate.Error
     ) where
@@ -33,6 +36,7 @@
 import Data.Monoid
 import Data.Maybe (isJust)
 import Data.Predicate
+import Data.Vault.Lazy (Key)
 import Data.Word
 import Network.HTTP.Types
 import Network.Wai.Predicate.Accept
@@ -43,6 +47,8 @@
 import Network.Wai.Predicate.Utility
 import Network.Wai
 
+import qualified Data.Vault.Lazy as Vault
+
 request :: (HasRequest r) => Predicate r f Request
 request = return . getRequest
 
@@ -89,3 +95,9 @@
     if null (lookupCookie k r)
         then Fail (err status400 ("Missing cookie '" <> k <> "'."))
         else return ()
+
+fromVault :: HasVault r => Key a -> Predicate r Error a
+fromVault k r = case Vault.lookup k (requestVault r) of
+    Nothing -> Fail (err status500 "Vault does not contain key.")
+    Just  a -> return a
+
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
@@ -12,6 +12,7 @@
     , HasQuery   (..)
     , HasPath    (..)
     , HasRequest (..)
+    , HasVault   (..)
 
     , fromRequest
     , lookupHeader
@@ -23,6 +24,7 @@
 import Data.ByteString (ByteString)
 import Data.Maybe (mapMaybe)
 import Data.Vector (Vector, (!?))
+import Data.Vault.Lazy (Vault)
 import Data.Word
 import Network.HTTP.Types
 import Network.Wai (Request)
@@ -50,6 +52,9 @@
 class HasPath a where
     segments :: a -> Vector ByteString
 
+class HasVault a where
+    requestVault :: a -> Vault
+
 data Req = Req
     { _request  :: Request
     , _cookies  :: Cookies
@@ -82,6 +87,9 @@
 
 instance HasPath Req where
     segments = _segments
+
+instance HasVault Req where
+    requestVault = Wai.vault . _request
 
 fromRequest :: Request -> Req
 fromRequest rq =
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.3
+version:             0.3.1
 synopsis:            WAI request predicates
 license:             OtherLicense
 license-file:        LICENSE
@@ -55,6 +55,7 @@
       , case-insensitive == 1.1.*
       , http-types       == 0.8.*
       , transformers     == 0.3.*
+      , vault            == 0.3.*
       , vector           == 0.10.*
       , wai              >= 2.0 && < 2.2
 
