diff --git a/JSON-Combinator.cabal b/JSON-Combinator.cabal
--- a/JSON-Combinator.cabal
+++ b/JSON-Combinator.cabal
@@ -1,5 +1,5 @@
 Name:               JSON-Combinator
-Version:            0.2.3
+Version:            0.2.4
 License:            BSD3
 License-File:       LICENSE
 Author:             Tony Morris <ʇǝu˙sıɹɹoɯʇ@ןןǝʞsɐɥ>
diff --git a/Text/JSON/Combinator.hs b/Text/JSON/Combinator.hs
--- a/Text/JSON/Combinator.hs
+++ b/Text/JSON/Combinator.hs
@@ -428,7 +428,7 @@
 
 -- | Returns the possible value associated with the given field if this is an object. An alias for 'field'.
 (-|) ::
-  (JSONField j f, Failure (NoSuchField f) m) =>
+  (JSONField j f, Failure (NoSuchFieldOrExpectedObject f j) m) =>
   f
   -> j -- ^ The JSON value.
   -> m j
@@ -576,7 +576,7 @@
 
 -- | Traverses down JSON objects with the association fields and returns the potential value.
 field' ::
-  (F.Foldable t, Failure (NoSuchField f) m, JSONField j f) =>
+  (F.Foldable t, Failure (NoSuchFieldOrExpectedObject f j) m, JSONField j f) =>
   t f
   -> j
   -> m j
@@ -585,7 +585,7 @@
 
 -- | Traverses down JSON objects with the association fields and returns the potential value. An alias for 'field''.
 (-||) ::
-  (F.Foldable t, Failure (NoSuchField f) m, JSONField j f) =>
+  (F.Foldable t, Failure (NoSuchFieldOrExpectedObject f j) m, JSONField j f) =>
   t f
   -> j
   -> m j
diff --git a/Text/JSON/Failure.hs b/Text/JSON/Failure.hs
--- a/Text/JSON/Failure.hs
+++ b/Text/JSON/Failure.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE RankNTypes, DeriveDataTypeable #-}
 
 -- | Data structures that used to denote failure of accessing JSON values.
 module Text.JSON.Failure
@@ -9,6 +9,7 @@
 , ExpectedNumber(..)
 , ExpectedString(..)
 , ExpectedArray(..)
+, NoSuchFieldOrExpectedObject(..)
 ) where
 
 import Data.Data
@@ -42,3 +43,7 @@
 data ExpectedString j =
   ExpectedString j
   deriving (Eq, Ord, Show, Data, Typeable)
+
+data NoSuchFieldOrExpectedObject z j =
+  NoSuchFieldOrExpectedObject (forall x. (NoSuchField z -> x) -> (ExpectedObject j -> x) -> x)
+
diff --git a/Text/JSON/JSONField.hs b/Text/JSON/JSONField.hs
--- a/Text/JSON/JSONField.hs
+++ b/Text/JSON/JSONField.hs
@@ -16,17 +16,20 @@
 import Control.Failure
 import qualified Data.Map as M
 
+-- | Accessing JSON object fields.
 class JSONField j f | j -> f where
+  -- | Access the field of a JSON object with potential failure.
   field ::
-    Failure (NoSuchField f) m =>
+    Failure (NoSuchFieldOrExpectedObject f j) m =>
     f
     -> j
     -> m j
+  -- | Access all fields of a JSON object with potential failure.
   fields ::
     Failure (ExpectedObject j) m =>
     j
     -> m [f]
-  -- | Returns the potential object field values of a JSON value.
+  -- | Returns all object field values of a JSON value.
   values ::
     Failure (ExpectedObject j) m =>
     j
@@ -35,10 +38,10 @@
 instance JSONField JSON ByteString where
   field f (Object o) =
     case T.lookup f o of
-      Nothing -> failure (NoSuchField f)
+      Nothing -> failure (NoSuchFieldOrExpectedObject (\x _ -> x (NoSuchField f)) :: NoSuchFieldOrExpectedObject ByteString JSON)
       Just x  -> return x
-  field f _ =
-    failure (NoSuchField f)
+  field _ j =
+    failure (NoSuchFieldOrExpectedObject (\_ y -> y (ExpectedObject j)) :: NoSuchFieldOrExpectedObject ByteString JSON)
   fields (Object o) =
     return (T.keys o)
   fields j =
@@ -51,10 +54,10 @@
 instance JSONField J.JSValue [Char] where
   field f (J.JSObject (JSONObject o)) =
     case lookup f o of
-      Nothing -> failure (NoSuchField f)
+      Nothing -> failure (NoSuchFieldOrExpectedObject (\x _ -> x (NoSuchField f)) :: NoSuchFieldOrExpectedObject String J.JSValue)
       Just x  -> return x
-  field f _ =
-    failure (NoSuchField f)
+  field _ j =
+    failure (NoSuchFieldOrExpectedObject (\_ y -> y (ExpectedObject j)) :: NoSuchFieldOrExpectedObject String J.JSValue)
   fields (J.JSObject (JSONObject o)) =
     return (fmap fst o)
   fields j =
@@ -67,10 +70,10 @@
 instance JSONField H.Json [Char] where
   field f (H.JObject o) =
     case M.lookup f o of
-      Nothing -> failure (NoSuchField f)
+      Nothing -> failure (NoSuchFieldOrExpectedObject (\x _ -> x (NoSuchField f)) :: NoSuchFieldOrExpectedObject String H.Json)
       Just x  -> return x
-  field f _ =
-    failure (NoSuchField f)
+  field _ j =
+    failure (NoSuchFieldOrExpectedObject (\_ y -> y (ExpectedObject j)) :: NoSuchFieldOrExpectedObject String H.Json)
   fields (H.JObject o) =
     return (M.keys o)
   fields j =
