diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -59,7 +59,12 @@
          274 import qualified Data.Vector.Storable as DVS
          274 import qualified Data.ByteString as BS
          274 import System.IO.MMap
+         274 import Control.Monad
          274 import Data.Word
+         274 import HaskellWorks.Data.Bits.BitShown
+         274 import HaskellWorks.Data.Succinct.BalancedParens.Simple
+         274 import HaskellWorks.Data.FromForeignRegion
+         274 import HaskellWorks.Diagnostics
          274 (fptr :: ForeignPtr Word8, offset, size) <- mmapFileForeignPtr "/Users/jky/Downloads/78mbs.json" ReadOnly Nothing
          601 cursor <- measure (fromForeignRegion (fptr, offset, size) :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64)))
 
diff --git a/hw-json.cabal b/hw-json.cabal
--- a/hw-json.cabal
+++ b/hw-json.cabal
@@ -1,5 +1,5 @@
 name:                   hw-json
-version:                0.1.0.0
+version:                0.2.0.0
 synopsis:               Conduits for tokenizing streams.
 description:            Please see README.md
 homepage:               http://github.com/haskell-works/hw-json#readme
@@ -40,6 +40,7 @@
                       , HaskellWorks.Data.Json.Conduit
                       , HaskellWorks.Data.Json.Conduit.Blank
                       , HaskellWorks.Data.Json.Conduit.Words
+                      , HaskellWorks.Data.Json.FromValue
                       , HaskellWorks.Data.Json.Succinct
                       , HaskellWorks.Data.Json.Succinct.Cursor
                       , HaskellWorks.Data.Json.Succinct.Cursor.BalancedParens
@@ -62,9 +63,11 @@
                       , containers
                       , hw-bits
                       , hw-conduit
+                      , hw-diagnostics
                       , hw-parser
                       , hw-prim                       >= 0.0.3.1
                       , hw-rankselect                 >= 0.0.0.5
+                      , mmap
                       , mono-traversable
                       , resourcet
                       , text
diff --git a/src/HaskellWorks/Data/Json/FromValue.hs b/src/HaskellWorks/Data/Json/FromValue.hs
new file mode 100644
--- /dev/null
+++ b/src/HaskellWorks/Data/Json/FromValue.hs
@@ -0,0 +1,53 @@
+{-# LANGUAGE FlexibleInstances    #-}
+{-# LANGUAGE TypeSynonymInstances #-}
+
+module HaskellWorks.Data.Json.FromValue where
+
+import           HaskellWorks.Data.Decode
+import           HaskellWorks.Data.Json.Value
+
+class FromJsonValue a where
+  fromJsonValue :: JsonValue -> Either DecodeError a
+
+instance FromJsonValue JsonValue where
+  fromJsonValue = Right
+
+instance FromJsonValue String where
+  fromJsonValue v = case v of
+    JsonString r  -> Right r
+    _             -> Left (DecodeError "Not a string")
+
+instance FromJsonValue Int where
+  fromJsonValue v = case v of
+    JsonNumber r  -> Right (floor r)
+    _             -> Left (DecodeError "Not an integer")
+
+instance FromJsonValue Double where
+  fromJsonValue v = case v of
+    JsonNumber r  -> Right r
+    _             -> Left (DecodeError "Not a double")
+
+instance FromJsonValue Bool where
+  fromJsonValue v = case v of
+    JsonBool r    -> Right r
+    _             -> Left (DecodeError "Not a boolean")
+
+instance FromJsonValue a => FromJsonValue [a] where
+  fromJsonValue v = case v of
+    JsonArray xs  -> mapM fromJsonValue xs
+    _             -> Left (DecodeError "Not an array")
+
+instance (FromJsonValue a, FromJsonValue b) => FromJsonValue (a, b) where
+  fromJsonValue v = case v of
+    JsonArray (a:b:_) -> (,) <$> fromJsonValue a <*> fromJsonValue b
+    _                 -> Left (DecodeError "Not a 2-tuple")
+
+instance (FromJsonValue a, FromJsonValue b, FromJsonValue c) => FromJsonValue (a, b, c) where
+  fromJsonValue v = case v of
+    JsonArray (a:b:c:_) -> (,,) <$> fromJsonValue a <*> fromJsonValue b <*> fromJsonValue c
+    _                   -> Left (DecodeError "Not a 3-tuple")
+
+instance (FromJsonValue a, FromJsonValue b, FromJsonValue c, FromJsonValue d) => FromJsonValue (a, b, c, d) where
+  fromJsonValue v = case v of
+    JsonArray (a:b:c:d:_) -> (,,,) <$> fromJsonValue a <*> fromJsonValue b <*> fromJsonValue c <*> fromJsonValue d
+    _                     -> Left (DecodeError "Not a 4-tuple")
diff --git a/src/HaskellWorks/Data/Json/Value.hs b/src/HaskellWorks/Data/Json/Value.hs
--- a/src/HaskellWorks/Data/Json/Value.hs
+++ b/src/HaskellWorks/Data/Json/Value.hs
@@ -25,9 +25,6 @@
 class JsonValueAt a where
   jsonValueAt :: a -> Either DecodeError JsonValue
 
-class FromJsonValue a where
-  fromJsonValue :: JsonValue -> Either DecodeError a
-
 instance JsonValueAt JsonIndex where
   jsonValueAt i = case i of
     JsonIndexString  s  -> case ABC.parse parseJsonString s of
@@ -49,6 +46,3 @@
             ABC.Fail    {}  -> Left (DecodeError ("Invalid field: '" ++ show (BS.take 20 bs) ++ "...'"))
             ABC.Partial _   -> Left (DecodeError "Unexpected end of field")
             ABC.Done    _ s -> Right s
-
-instance FromJsonValue JsonValue where
-  fromJsonValue = Right
