diff --git a/Data/UnixTime/Sys.hsc b/Data/UnixTime/Sys.hsc
--- a/Data/UnixTime/Sys.hsc
+++ b/Data/UnixTime/Sys.hsc
@@ -1,3 +1,4 @@
+{-# LANGUAGE CApiFFI #-}
 {-# LANGUAGE ForeignFunctionInterface #-}
 
 module Data.UnixTime.Sys (getUnixTime) where
@@ -17,7 +18,7 @@
 type CTimeVal = ()
 type CTimeZone = ()
 
-foreign import ccall unsafe "gettimeofday"
+foreign import capi unsafe "sys/time.h gettimeofday"
     c_gettimeofday :: Ptr CTimeVal -> Ptr CTimeZone -> IO CInt
 
 -- |
diff --git a/Data/UnixTime/Types.hsc b/Data/UnixTime/Types.hsc
--- a/Data/UnixTime/Types.hsc
+++ b/Data/UnixTime/Types.hsc
@@ -64,12 +64,29 @@
             (#poke struct timeval, tv_sec)  ptr (fromIntegral sec :: Word32)
             (#poke struct timeval, tv_usec) ptr (utMicroSeconds ut)
 #else
-    peek ptr    = UnixTime
-            <$> (#peek struct timeval, tv_sec)  ptr
-            <*> (#peek struct timeval, tv_usec) ptr
+    -- On Unix, the struct `timeval` is defined as
+    --
+    --      struct timeval
+    --      {
+    --          time_t      tv_sec;
+    --          suseconds_t tv_usec;
+    --      };
+    --
+    -- The type `suseconds_t` is a signed integer type capable of storing
+    -- values at least in the range `[-1, 1000000]`. It's size is platform
+    -- specific, and it is 8 bytes long on 64-bit platforms.
+    --
+    -- Here we peek `tv_usec` using the `CSUSeconds` type and then convert it
+    -- to `Int32` (the type of `utMicroSeconds`) relying on the fact that
+    -- `tv_usec` is no bigger than `1000000`, and hence we will not overflow.
+    peek ptr    = do
+            sec <- (#peek struct timeval, tv_sec) ptr
+            CSUSeconds msec <- (#peek struct timeval, tv_usec) ptr
+            return $ UnixTime sec (fromIntegral msec)
     poke ptr ut = do
+            let msec = CSUSeconds $ fromIntegral (utMicroSeconds ut)
             (#poke struct timeval, tv_sec)  ptr (utSeconds ut)
-            (#poke struct timeval, tv_usec) ptr (utMicroSeconds ut)
+            (#poke struct timeval, tv_usec) ptr msec
 #endif
 
 #if __GLASGOW_HASKELL__ >= 704
diff --git a/unix-time.cabal b/unix-time.cabal
--- a/unix-time.cabal
+++ b/unix-time.cabal
@@ -1,6 +1,6 @@
 cabal-version:      1.18
 name:               unix-time
-version:            0.4.12
+version:            0.4.13
 license:            BSD3
 license-file:       LICENSE
 maintainer:         Kazu Yamamoto <kazu@iij.ad.jp>
@@ -43,7 +43,7 @@
     include-dirs:     cbits
     ghc-options:      -Wall
     build-depends:
-        base >=4 && <5,
+        base >=4.4 && <5,
         bytestring,
         old-time,
         binary
