diff --git a/Data/Time/Clock/Scale.hs b/Data/Time/Clock/Scale.hs
--- a/Data/Time/Clock/Scale.hs
+++ b/Data/Time/Clock/Scale.hs
@@ -106,3 +106,9 @@
 -- | Create a 'DiffTime' from a number of picoseconds.
 picosecondsToDiffTime :: Integer -> DiffTime
 picosecondsToDiffTime x = fromRational (x % 1000000000000)
+
+{-# RULES
+"realToFrac/DiffTime->Pico"              realToFrac = \ (MkDiffTime ps) -> ps
+"realToFrac/Pico->DiffTime"              realToFrac = MkDiffTime
+  #-}
+
diff --git a/Data/Time/Clock/UTC.hs b/Data/Time/Clock/UTC.hs
--- a/Data/Time/Clock/UTC.hs
+++ b/Data/Time/Clock/UTC.hs
@@ -118,3 +118,12 @@
 	round (MkNominalDiffTime a) = round a
 	ceiling (MkNominalDiffTime a) = ceiling a
 	floor (MkNominalDiffTime a) = floor a
+
+{-# RULES
+"realToFrac/DiffTime->NominalDiffTime"   realToFrac = \ dt -> MkNominalDiffTime (realToFrac dt)
+"realToFrac/NominalDiffTime->DiffTime"   realToFrac = \ (MkNominalDiffTime ps) -> realToFrac ps
+
+"realToFrac/NominalDiffTime->Pico"       realToFrac = \ (MkNominalDiffTime ps) -> ps
+"realToFrac/Pico->NominalDiffTime"       realToFrac = MkNominalDiffTime
+  #-}
+
diff --git a/test/Makefile b/test/Makefile
--- a/test/Makefile
+++ b/test/Makefile
@@ -52,6 +52,9 @@
 TestParseTime: TestParseTime.o
 	$(GHC) $(GHCFLAGS) $^ -o $@
 
+RealToFracBenchmark: RealToFracBenchmark.o
+	$(GHC) $(GHCFLAGS) $^ -o $@
+
 test:	\
 	TestMonthDay.diff	\
 	ConvertBack.diff0	\
@@ -64,13 +67,14 @@
 	TestFormat.diff0	\
 	TestParseDAT.diff	\
 	TestEaster.diff	\
-	TestParseTime.run \
-	UseCases.o
+	TestParseTime.run	\
+	UseCases.o	\
+	RealToFracBenchmark.run
 	@echo "Success!"
 
 clean:
 	rm -rf TestMonthDay ConvertBack TestCalendars TestTime LongWeekYears ClipDates	\
-	AddDays TestFormat TestParseDAT TestEaster CurrentTime ShowDST TimeZone TimeZone.ref TestParseTime \
+	AddDays TestFormat TestParseDAT TestEaster CurrentTime ShowDST TimeZone TimeZone.ref TestParseTime RealToFracBenchmark \
         *.out *.run *.o *.hi Makefile.bak
 
 %.diff: %.ref %.out
diff --git a/test/RealToFracBenchmark.hs b/test/RealToFracBenchmark.hs
new file mode 100644
--- /dev/null
+++ b/test/RealToFracBenchmark.hs
@@ -0,0 +1,22 @@
+{- Contributed by Liyang HU <haskell.org@liyang.hu> -}
+module Main where
+
+import Prelude
+import Control.Applicative
+import Control.Monad
+import Control.DeepSeq
+import Data.Time
+import Data.Time.Clock.POSIX
+import System.Random
+
+main :: IO ()
+main = do
+    ts <- replicateM 100000 $ do
+        t <- posixSecondsToUTCTime . realToFrac <$>
+            ( (*) . fromInteger <$> randomRIO (-15*10^21, 15*10^21) <*>
+                randomIO :: IO Double ) :: IO UTCTime
+        rnf t `seq` return t
+    now <- getCurrentTime
+    print . sum $ map (diffUTCTime now) ts
+    print =<< flip diffUTCTime now <$> getCurrentTime
+
diff --git a/test/TimeZone.ref b/test/TimeZone.ref
deleted file mode 100644
--- a/test/TimeZone.ref
+++ /dev/null
@@ -1,1 +0,0 @@
--0700
diff --git a/time.cabal b/time.cabal
--- a/time.cabal
+++ b/time.cabal
@@ -1,5 +1,5 @@
 name:           time
-version:        1.4
+version:        1.4.0.1
 stability:      stable
 license:        BSD3
 license-file:   LICENSE
