diff --git a/Database/SQLite/Simple/FromField.hs b/Database/SQLite/Simple/FromField.hs
--- a/Database/SQLite/Simple/FromField.hs
+++ b/Database/SQLite/Simple/FromField.hs
@@ -46,6 +46,7 @@
 import qualified Data.Text as T
 import qualified Data.Text.Lazy as LT
 import           Data.Typeable (Typeable, typeOf)
+import           GHC.Float (double2Float)
 
 import           System.Locale (defaultTimeLocale)
 
@@ -130,6 +131,10 @@
     fromField (Field (SQLFloat flt) _) = Ok flt
     fromField f                        = returnError ConversionFailed f "need a float"
 
+instance FromField Float where
+    fromField (Field (SQLFloat flt) _) = Ok . double2Float $ flt
+    fromField f                        = returnError ConversionFailed f "need a float"
+
 instance FromField Bool where
     fromField f@(Field (SQLInteger b) _)
       | (b == 0) || (b == 1) = Ok (b /= 0)
@@ -165,9 +170,13 @@
 
   fromField f                     = returnError ConversionFailed f "expecting SQLText column type"
 
+
 instance FromField Day where
-  fromField (Field (SQLText t) _) = Ok . read . T.unpack $ t
-  fromField f                     = returnError ConversionFailed f "expecting SQLText column type"
+  fromField f@(Field (SQLText t) _) =
+    case parseTime defaultTimeLocale "%Y-%m-%d" . T.unpack $ t of
+      Just t -> Ok t
+      Nothing -> returnError ConversionFailed f "couldn't parse Day field"
+  fromField f = returnError ConversionFailed f "expecting SQLText column type"
 
 fieldTypename :: Field -> String
 fieldTypename = B.unpack . gettypename . result
diff --git a/sqlite-simple.cabal b/sqlite-simple.cabal
--- a/sqlite-simple.cabal
+++ b/sqlite-simple.cabal
@@ -1,5 +1,5 @@
 Name:                sqlite-simple
-Version:             0.4.3.1
+Version:             0.4.4.0
 Synopsis:            Mid-Level SQLite client library
 Description:
     Mid-level SQLite client library, based on postgresql-simple.
diff --git a/test/Simple.hs b/test/Simple.hs
--- a/test/Simple.hs
+++ b/test/Simple.hs
@@ -10,7 +10,7 @@
   ) where
 
 import qualified Data.Text as T
-import Data.Time (UTCTime)
+import Data.Time (UTCTime, Day)
 import Common
 
 -- Simplest SELECT
@@ -39,6 +39,10 @@
   assertEqual "nulls" Nothing r
   [Only r] <- query_ conn "SELECT 1" :: IO [Only (Maybe Int)]
   assertEqual "nulls" (Just 1) r
+  [Only r] <- query_ conn "SELECT 1.0" :: IO [Only Double]
+  assertEqual "doubles" 1.0 r
+  [Only r] <- query_ conn "SELECT 1.0" :: IO [Only Float]
+  assertEqual "floats" 1.0 r
 
 testSimpleParams :: TestEnv -> Test
 testSimpleParams TestEnv{..} = TestCase $ do
@@ -60,6 +64,10 @@
   assertEqual "select params" "test2" r2
   [Only i] <- query conn "SELECT ?+?" [42 :: Int, 1 :: Int] :: IO [Only Int]
   assertEqual "select int param" 43 i
+  [Only d] <- query conn "SELECT ?" [2.0 :: Double] :: IO [Only Double]
+  assertEqual "select double param" 2.0 d
+  [Only f] <- query conn "SELECT ?" [4.0 :: Float] :: IO [Only Float]
+  assertEqual "select double param" 4.0 f
 
 testSimpleTime :: TestEnv -> Test
 testSimpleTime TestEnv{..} = TestCase $ do
@@ -79,6 +87,17 @@
   rows <- query conn "SELECT * FROM time2 WHERE t = ?" (Only time) :: IO [Only UTCTime]
   assertEqual "should see one row result" 1 (length rows)
   assertEqual "UTCTime" time t
+  -- Days
+  let daystr = "2013-08-21"
+      day    = read daystr :: Day
+  [Only day'] <- query_ conn (Query (T.concat ["SELECT '", T.pack daystr, "'"]))
+  day @?= day'
+  [Only day''] <- query conn "SELECT ?" (Only day)
+  day @?= day''
+  -- database timestamp -> day conversion is treated as an error, but
+  -- try converting a timestamp to a date and see we get it back ok
+  [Only dayx] <- query_ conn "SELECT date('2013-08-21 08:00:03.256887')"
+  day @?= dayx
 
 testSimpleTimeFract :: TestEnv -> Test
 testSimpleTimeFract TestEnv{..} = TestCase $ do
