diff --git a/JsonGrammar.cabal b/JsonGrammar.cabal
--- a/JsonGrammar.cabal
+++ b/JsonGrammar.cabal
@@ -1,5 +1,5 @@
 Name:           JsonGrammar
-Version:        0.3.1
+Version:        0.3.2
 Synopsis:       Combinators for bidirectional JSON parsing
 Description:   	Combinators for bidirectional JSON parsing
 
@@ -7,7 +7,7 @@
 Author:         Martijn van Steenbergen
 Maintainer:     martijn@van.steenbergen.nl
 Stability:      Experimental
-Copyright:      Some Rights Reserved (CC) 2010 Martijn van Steenbergen
+Copyright:      Some Rights Reserved (CC) 2010-2011 Martijn van Steenbergen
 Homepage:       https://github.com/MedeaMelana/JsonGrammar
 Bug-reports:    https://github.com/MedeaMelana/JsonGrammar/issues
 
@@ -25,17 +25,19 @@
                     Data.Iso.TH,
                     Data.Iso.Common,
                     Language.JsonGrammar
-  Build-Depends:    base >= 3.0 && < 4.5,
+  Build-Depends:    base >= 3.0 && < 4.6,
                     containers >= 0.3 && < 0.5,
-                    aeson >= 0.3 && < 0.4,
-                    semigroups >= 0.5 && < 0.6,
-                    template-haskell >= 2.4 && < 2.7,
-                    -- constraints copied from aeson-0.3.2.5:
-                    attoparsec >= 0.8.5.3,
+                    aeson >= 0.6 && < 0.7,
+                    semigroups >= 0.5 && < 0.9,
+                    template-haskell >= 2.4 && < 2.8,
+                    -- constraints copied from aeson-0.6.0.0:
+                    attoparsec >= 0.8.6.1,
                     bytestring,
+                    hashable >= 1.1.2.0,
                     text >= 0.11.0.2,
                     time,
-                    vector >= 0.7
+                    unordered-containers >= 0.1.3.0,
+                    vector >= 0.7.1
 
 Source-Repository head
   Type:         git
diff --git a/Language/JsonGrammar.hs b/Language/JsonGrammar.hs
--- a/Language/JsonGrammar.hs
+++ b/Language/JsonGrammar.hs
@@ -21,11 +21,12 @@
 import Data.Attoparsec.Number
 import Data.ByteString (ByteString)
 import qualified Data.ByteString.Lazy as Lazy
+import Data.Hashable (Hashable)
 import Data.Int
-import Data.IntSet
+import Data.IntSet (IntSet)
 import Data.Iso hiding (option)
-import qualified Data.Map as M
-import Data.Maybe (fromMaybe)
+import qualified Data.HashMap.Lazy as M
+import Data.Maybe (fromMaybe, isJust)
 import Data.String
 import Data.Text (Text)
 import qualified Data.Text.Lazy as Lazy
@@ -90,8 +91,7 @@
         >>> inverse nil        -- t2
 
 -- | Describe a single array element with the given grammar.
-elementBy :: Iso (Value :- t) (a :- t) ->
-  Iso ([Value] :- t) ([Value] :- a :- t)
+elementBy :: Iso (Value :- t1) t2 -> Iso ([Value] :- t1) ([Value] :- t2)
 elementBy g = inverse cons  -- Value   :- [Value] :- t
           >>> swap          -- [Value] :- Value :- t
           >>> duck g        -- [Value] :- a :- t
@@ -115,7 +115,7 @@
       value <- M.lookup textName o
       return (M.delete textName o :- value :- r)
     to (o :- value :- r) = do
-      guard (M.notMember textName o)
+      guard (notMember textName o)
       return (M.insert textName value o :- r)
 
 -- | Expect a specific key/value pair.
@@ -128,11 +128,15 @@
       guard (value' == value)
       return (M.delete textName o)
     to o = do
-      guard (M.notMember textName o)
+      guard (notMember textName o)
       return (M.insert textName value o)
 
+-- Defined in Data.Map but not in Data.HashMap.Lazy:
+notMember :: (Eq k, Hashable k) => k -> M.HashMap k v -> Bool
+notMember k m = isJust (M.lookup k m)
+
 -- | Collect all properties left in an object.
-rest :: Iso (Object :- t) (Object :- M.Map Text Value :- t)
+rest :: Iso (Object :- t) (Object :- M.HashMap Text Value :- t)
 rest = lit M.empty
 
 -- | Match and discard all properties left in the object. When converting back to JSON, produces no properties.
