diff --git a/formatting.cabal b/formatting.cabal
--- a/formatting.cabal
+++ b/formatting.cabal
@@ -1,5 +1,5 @@
 name:                formatting
-version:             3.1.3
+version:             3.1.4
 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
@@ -25,6 +25,7 @@
                      time,
                      old-locale
   hs-source-dirs:    src
+  ghc-options:       -O2
 
 source-repository head
   type:     git
diff --git a/src/Formatting/Formatters.hs b/src/Formatting/Formatters.hs
--- a/src/Formatting/Formatters.hs
+++ b/src/Formatting/Formatters.hs
@@ -29,6 +29,7 @@
   prec,
   shortest,
   commas,
+  ords,
   -- * Padding
   left,
   right,
@@ -133,3 +134,17 @@
   merge (f,c) rest | f == ',' = "," <> LT.singleton c <> rest
                    | otherwise = LT.singleton c <> rest
   cycle' xs = xs <> cycle' xs
+
+-- | Add a suffix to an integral, e.g. 1st, 2nd, 3rd, 21st.
+ords :: Integral n => Format n
+ords = later go
+  where go n
+          | tens > 3 && tens < 21 = T.shortest n <> "th"
+          | otherwise =
+            T.shortest n <>
+            case n `mod` 10 of
+              1 -> "st"
+              2 -> "nd"
+              3 -> "rd"
+              _ -> "th"
+          where tens = n `mod` 100
diff --git a/src/Formatting/Time.hs b/src/Formatting/Time.hs
--- a/src/Formatting/Time.hs
+++ b/src/Formatting/Time.hs
@@ -158,6 +158,12 @@
 dayOfMonth :: FormatTime a => Format a
 dayOfMonth = later (build . fmt "%d")
 
+-- | Day of month, @1st@, @2nd@, @25th@, etc.
+dayOfMonthOrd :: FormatTime a => Format a
+dayOfMonthOrd = later (bprint ords . toInt)
+  where toInt :: FormatTime a => a -> Int
+        toInt = read . formatTime defaultTimeLocale "%d"
+
 -- | Day of month, leading space as needed, @ 1@ - @31@.
 dayOfMonthS :: FormatTime a => Format a
 dayOfMonthS = later (build . fmt "%e")
