diff --git a/formatting.cabal b/formatting.cabal
--- a/formatting.cabal
+++ b/formatting.cabal
@@ -1,5 +1,5 @@
 name:                formatting
-version:             5.0
+version:             5.1
 synopsis:            Combinator-based type-safe formatting (like printf() or FORMAT)
 description:         Combinator-based type-safe formatting (like printf() or FORMAT), modelled from the HoleyMonoids package.
 license:             BSD3
diff --git a/src/Formatting/Holey.hs b/src/Formatting/Holey.hs
--- a/src/Formatting/Holey.hs
+++ b/src/Formatting/Holey.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE TypeSynonymInstances #-}
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE OverloadedStrings #-}
@@ -17,12 +18,13 @@
   (
   -- * Formatting library
   Format,
-  Holey (..),
+  Holey,
+  HoleyT (..),
   (%),
+  (%.),
   now,
   bind,
-  later,
-  hmap
+  later
   ) where
 
 import Data.Monoid
@@ -40,8 +42,13 @@
 -- this order allows holey monoids to be composed using `.`, stacking
 -- the expected arguments. Note that the `Monoid` constraint is only
 -- used in the identity 'Holey' and in composing two 'Holey's.
-newtype Holey m r a = Holey { runHM :: (m -> r) -> a }
+newtype HoleyT r a m = Holey { runHM :: (m -> r) -> a }
 
+type Holey m r a = HoleyT r a m
+
+instance Functor (HoleyT r a) where
+  fmap g m = Holey (\k -> runHM m (k . g))
+
 -- | Very useful instance for writing format string.
 instance (IsString m, a ~ r) => IsString (Holey m r a) where
   fromString = now . fromString
@@ -50,6 +57,11 @@
 (%) :: Monoid n => Holey n b c -> Holey n b1 b -> Holey n b1 c
 f % g = f `bind` \a -> g `bind` \b -> now (a `mappend` b)
 
+-- | Function compose two holeys. Will feed the result of one holey
+-- into another.
+(%.) :: Holey m r (a -> b) -> Holey a b c -> Holey m r c
+(%.) (Holey a) (Holey b) = Holey (b . a)
+
 -- | Insert a constant monoidal value.
 now :: m -> Holey m r r
 now a = Holey ($ a)
@@ -63,7 +75,3 @@
 -- converted to the monoid type using the given conversion function.
 later :: (a -> m) -> Holey m r (a -> r)
 later f = Holey (. f)
-
--- | Convert between underlying 'Monoid' types.
-hmap :: (m -> n) -> Holey m r a -> Holey n r a
-hmap g m = Holey (\k -> runHM m (k . g))
diff --git a/src/Formatting/Time.hs b/src/Formatting/Time.hs
--- a/src/Formatting/Time.hs
+++ b/src/Formatting/Time.hs
@@ -224,7 +224,8 @@
             suffix = now (if fix && ts < 0 then " ago" else "")
     toInt ts base = abs (round (ts / base))
     ranges =
-      [(0,int % " seconds",1)
+      [(0,int % " milliseconds",0.001)
+      ,(1,int % " seconds",1)
       ,(minute,fconst "a minute",0)
       ,(minute*2,int % " minutes",minute)
       ,(minute*30,fconst "half an hour",0)
