diff --git a/Data/Aeson/Parser.hs b/Data/Aeson/Parser.hs
--- a/Data/Aeson/Parser.hs
+++ b/Data/Aeson/Parser.hs
@@ -33,17 +33,17 @@
 import Data.Word (Word8)
 import qualified Data.Attoparsec as A
 import qualified Data.Attoparsec.Zepto as Z
+import qualified Data.ByteString.Char8 as B8
 import qualified Data.ByteString.Unsafe as B
 
 -- | Parse a top-level JSON value.  This must be either an object or
 -- an array.
 json :: Parser Value
 json = do
-  c <- skipSpace *> anyChar
-  case c of
-    '{' -> object_
-    '[' -> array_
-    _   -> fail "root value is not an object or array"
+  c <- skipSpace *> satisfy (`B8.elem` "{[")
+  if c == '{'
+    then object_
+    else array_
 
 object_ :: Parser Value
 object_ = {-# SCC "object_" #-} do
@@ -67,7 +67,7 @@
 value = most <|> (Number <$> number)
  where
   most = do
-    c <- anyChar
+    c <- satisfy (`B8.elem` "{[\"ftn")
     case c of
       '{' -> object_
       '[' -> array_
@@ -75,7 +75,7 @@
       'f' -> string "alse" *> pure (Bool False)
       't' -> string "rue" *> pure (Bool True)
       'n' -> string "ull" *> pure Null
-      _   -> fail "not a valid JSON value"
+      _   -> error "attoparsec panic! the impossible happened!"
 
 doubleQuote, backslash :: Word8
 doubleQuote = 34
diff --git a/aeson.cabal b/aeson.cabal
--- a/aeson.cabal
+++ b/aeson.cabal
@@ -1,5 +1,5 @@
 name:            aeson
-version:         0.3.2.6
+version:         0.3.2.7
 license:         BSD3
 license-file:    LICENSE
 category:        Text, Web, JSON
@@ -20,41 +20,41 @@
     Parsing performance on a late 2010 MacBook Pro (2.66GHz Core i7),
     for mostly-English tweets from Twitter's JSON search API:
     .
-    * 0.8 KB, 32-bit GHC 6.12.3: 29945 msg\/sec (24.4 MB\/sec)
+    * 0.8 KB, 32-bit GHC 6.12.3: 30538 msg\/sec (24.9 MB\/sec)
     .
-    * 0.8 KB, 64-bit GHC 7.0.3: 29280 msg\/sec (23.8 MB\/sec)
+    * 0.8 KB, 64-bit GHC 7.0.3: 31204 msg\/sec (25.4 MB\/sec)
     .
-    * 6.4 KB, 32-bit GHC 6.12.3: 6684 msg\/sec (42.0 MB\/sec)
+    * 6.4 KB, 32-bit GHC 6.12.3: 6731 msg\/sec (42.3 MB\/sec)
     .
-    * 6.4 KB, 64-bit GHC 7.0.3: 5893 msg\/sec (37.1 MB\/sec)
+    * 6.4 KB, 64-bit GHC 7.0.3: 6627 msg\/sec (41.7 MB\/sec)
     .
-    * 11.8 KB, 32-bit GHC 6.12.3: 3610 msg\/sec (41.5 MB\/sec)
+    * 11.8 KB, 32-bit GHC 6.12.3: 3751 msg\/sec (43.2 MB\/sec)
     .
-    * 11.8 KB, 64-bit GHC 7.0.3: 3059 msg\/sec (35.2 MB\/sec)
+    * 11.8 KB, 64-bit GHC 7.0.3: 3381 msg\/sec (38.9 MB\/sec)
     .
     * 31.2 KB, 32-bit GHC 6.12.3: 1306 msg\/sec (39.8 MB\/sec)
     .
-    * 31.2 KB, 64-bit GHC 7.0.3: 1050 msg\/sec (32.0 MB\/sec)
+    * 31.2 KB, 64-bit GHC 7.0.3: 1132 msg\/sec (34.5 MB\/sec)
     .
-    * 61.5 KB, 32-bit GHC 6.12.3: 594 msg\/sec (35.7 MB\/sec)
+    * 61.5 KB, 32-bit GHC 6.12.3: 616 msg\/sec (37.0 MB\/sec)
     .
-    * 61.5 KB, 64-bit GHC 7.0.3: 505 msg\/sec (30.3 MB\/sec)
+    * 61.5 KB, 64-bit GHC 7.0.3: 534 msg\/sec (32.1 MB\/sec)
     .
     Handling heavily-escaped text is a little more work.  Here is
     parsing performance with Japanese tweets, where much of the text
     is entirely Unicode-escaped.
     .
-    * 14.6 KB, 32-bit GHC 6.12.3: 2257 msg\/sec (32.2 MB\/sec)
+    * 14.6 KB, 32-bit GHC 6.12.3: 2315 msg\/sec (33.1 MB\/sec)
     .
-    * 14.6 KB, 64-bit GHC 7.0.3: 1931 msg\/sec (27.6 MB\/sec)
+    * 14.6 KB, 64-bit GHC 7.0.3: 1986 msg\/sec (28.4 MB\/sec)
     .
-    * 44.1 KB, 32-bit GHC 6.12.3: 697 msg\/sec (30.0 MB\/sec)
+    * 44.1 KB, 32-bit GHC 6.12.3: 712 msg\/sec (30.7 MB\/sec)
     .
-    * 44.1 KB, 64-bit GHC 7.0.3: 611 msg\/sec (26.3 MB\/sec)
+    * 44.1 KB, 64-bit GHC 7.0.3: 634 msg\/sec (27.3 MB\/sec)
     .
-    * 82.9 KB, 32-bit GHC 6.12.3: 368 msg\/sec (29.8 MB\/sec)
+    * 82.9 KB, 32-bit GHC 6.12.3: 377 msg\/sec (30.5 MB\/sec)
     .
-    * 82.9 KB, 64-bit GHC 7.0.3: 322 msg\/sec (26.0 MB\/sec)
+    * 82.9 KB, 64-bit GHC 7.0.3: 332 msg\/sec (26.9 MB\/sec)
     .
     Encoding performance on the same machine and data:
     .
