diff --git a/Data/Yaml.hs b/Data/Yaml.hs
--- a/Data/Yaml.hs
+++ b/Data/Yaml.hs
@@ -54,10 +54,12 @@
 import Control.Monad (liftM)
 import qualified Data.Vector as V
 import Data.Text (Text, pack)
+import Data.Text.Read (signed, decimal, double)
 import Data.Text.Encoding (encodeUtf8, decodeUtf8With)
 import Data.Text.Encoding.Error (lenientDecode)
 import qualified Data.HashMap.Strict as M
 import Data.Typeable
+import Data.Attoparsec.Number
 
 encode :: ToJSON a => a -> ByteString
 encode obj = unsafePerformIO $
@@ -150,14 +152,23 @@
     case a of
         Nothing -> return res
         Just an -> do
-            lift $ modify (Map.insert an $ String res)
+            lift $ modify (Map.insert an $ textToValue res)
             return res
 
+textToValue :: Text -> Value -- FIXME check for quoting style?
+textToValue "true" = Bool True
+textToValue "false" = Bool False
+textToValue "null" = Null
+textToValue t
+    | Right (x, "") <- signed decimal t = Number $ I x
+    | Right (x, "") <- double t = Number $ D x
+    | otherwise = String t
+
 parseO :: C.Sink Event Parse Value
 parseO = do
     me <- CL.head
     case me of
-        Just (EventScalar v _t _s a) -> fmap String $ parseScalar v a
+        Just (EventScalar v _t _s a) -> fmap textToValue $ parseScalar v a
         Just (EventSequenceStart a) -> parseS a id
         Just (EventMappingStart a) -> parseM a M.empty
         Just (EventAlias an) -> do
diff --git a/test/main.hs b/test/main.hs
--- a/test/main.hs
+++ b/test/main.hs
@@ -41,6 +41,7 @@
         it "encode/decode file" caseEncodeDecodeFileData
         it "encode/decode strings" caseEncodeDecodeStrings
         it "decode invalid file" caseDecodeInvalid
+        it "processes datatypes" caseDataTypes
     describe "Data.Yaml aliases" $ do
         it "simple scalar alias" caseSimpleScalarAlias
         it "simple sequence alias" caseSimpleSequenceAlias
@@ -284,6 +285,19 @@
     isJust maybeRes @? "decoder should return Just YamlObject but returned Nothing"
     let res = fromJust maybeRes
     mappingKey res "foo1" @?= (mkScalar "foo")
-    mappingKey res "k1" @?= (mkStrScalar "1")
-    mappingKey res "k2" @?= (mkStrScalar "2")
-    mappingKey res "k3" @?= (mkStrScalar "4")
+    mappingKey res "k1" @?= (D.Number 1)
+    mappingKey res "k2" @?= (D.Number 2)
+    mappingKey res "k3" @?= (D.Number 4)
+
+caseDataTypes :: Assertion
+caseDataTypes =
+    D.decode (D.encode val) @?= Just val
+  where
+    val = object
+        [ ("string", D.String "foo")
+        , ("int", D.Number 5)
+        , ("float", D.Number 4.3)
+        , ("true", D.Bool True)
+        , ("false", D.Bool False)
+        , ("null", D.Null)
+        ]
diff --git a/yaml.cabal b/yaml.cabal
--- a/yaml.cabal
+++ b/yaml.cabal
@@ -1,5 +1,5 @@
 name:            yaml
-version:         0.5.1
+version:         0.5.1.1
 license:         BSD3
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>, Anton Ageev <antage@gmail.com>,Kirill Simonov 
@@ -36,6 +36,7 @@
                    , unordered-containers
                    , vector
                    , text
+                   , attoparsec
     exposed-modules: Text.Libyaml
                      Data.Yaml
     ghc-options:     -Wall
