diff --git a/Data/Object.hs b/Data/Object.hs
--- a/Data/Object.hs
+++ b/Data/Object.hs
@@ -18,7 +18,8 @@
 --
 ---------------------------------------------------------
 module Data.Object
-    ( Object (..)
+    ( Object
+    , GenObject (..)
     , FromObject (..)
     , ToObject (..)
     , FromScalar (..)
@@ -26,17 +27,21 @@
     , oLookup
     ) where
 
-import qualified Data.ByteString as B
+import qualified Data.ByteString.Lazy as B
+import qualified Data.ByteString as BS
 import Data.ByteString.Class
 import Control.Arrow
 import Data.Time.Calendar
+import Safe (readMay)
 
-data Object =
-    Mapping [(B.ByteString, Object)]
-    | Sequence [Object]
-    | Scalar B.ByteString
+data GenObject key val =
+    Mapping [(key, GenObject key val)]
+    | Sequence [GenObject key val]
+    | Scalar val
     deriving (Show)
 
+type Object = GenObject B.ByteString B.ByteString
+
 class ToObject a where
     toObject :: a -> Object
 class FromObject a where
@@ -60,10 +65,19 @@
 instance FromObject B.ByteString where
     fromObject = bsFromObject
 
+instance ToScalar BS.ByteString where
+    toScalar = toLazyByteString
+instance FromScalar BS.ByteString where
+    fromScalar = return . fromLazyByteString
+instance ToObject BS.ByteString where
+    toObject = Scalar . toScalar
+instance FromObject BS.ByteString where
+    fromObject o = fromObject o >>= fromScalar
+
 instance ToScalar String where
-    toScalar = toStrictByteString
+    toScalar = toLazyByteString
 instance FromScalar String where
-    fromScalar = return . fromStrictByteString
+    fromScalar = return . fromLazyByteString
 instance ToObject String where
     toObject = Scalar . toScalar
 instance FromObject String where
@@ -105,26 +119,50 @@
         Nothing -> fail $ "Key not found: " ++ show key
         Just x -> fromObject x
 
--- helper
-readM :: (Read r, Monad m) => String -> m r
-readM s = case reads s of
-            ((x, _):_) -> return x
-            _ -> fail $ "Unable to read: " ++ s
 -- instances
 
 instance ToScalar Day where
-    toScalar = toStrictByteString . show
+    toScalar = toLazyByteString . show
 instance ToObject Day where
     toObject = toObject . toScalar
 instance FromScalar Day where
     fromScalar bs = do
-        let s = fromStrictByteString bs
+        let s = fromLazyByteString bs
         if length s /= 10
             then fail ("Invalid day: " ++ s)
             else do
-                y <- readM $ take 4 s
-                m <- readM $ take 2 $ drop 5 s
-                d <- readM $ take 2 $ drop 8 s
-                return $ fromGregorian y m d
+                let x = do
+                    y' <- readMay $ take 4 s
+                    m' <- readMay $ take 2 $ drop 5 s
+                    d' <- readMay $ take 2 $ drop 8 s
+                    return (y', m', d')
+                case x of
+                    Just (y, m, d) -> return $ fromGregorian y m d
+                    Nothing -> fail $ "Invalid day: " ++ s
 instance FromObject Day where
+    fromObject o = fromObject o >>= fromScalar
+
+instance ToScalar Bool where
+    toScalar b = toScalar $ if b then "true" else "false"
+instance ToObject Bool where
+    toObject = toObject . toScalar
+instance FromScalar Bool where
+    fromScalar bs =
+        case fromLazyByteString bs of
+            "true" -> return True
+            "false" -> return False
+            x -> fail $ "Invalid bool value: " ++ x
+instance FromObject Bool where
+    fromObject o = fromObject o >>= fromScalar
+
+instance ToScalar Int where
+    toScalar = toScalar . show
+instance ToObject Int where
+    toObject = toObject . toScalar
+instance FromScalar Int where
+    fromScalar bs =
+        case readMay $ fromLazyByteString bs of
+            Nothing -> fail $ "Invalid integer: " ++ fromLazyByteString bs
+            Just i -> return i
+instance FromObject Int where
     fromObject o = fromObject o >>= fromScalar
diff --git a/data-object.cabal b/data-object.cabal
--- a/data-object.cabal
+++ b/data-object.cabal
@@ -1,5 +1,5 @@
 name:            data-object
-version:         0.0.1
+version:         0.0.2
 license:         BSD3
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
@@ -19,6 +19,7 @@
     build-depends:   base >= 4 && < 5,
                      bytestring-class,
                      bytestring >= 0.9.1.4 && < 1,
-                     time >= 1
+                     time >= 1,
+                     safe
     exposed-modules: Data.Object
     ghc-options:     -Wall
