diff --git a/nix-diff.cabal b/nix-diff.cabal
--- a/nix-diff.cabal
+++ b/nix-diff.cabal
@@ -1,5 +1,5 @@
 name:                nix-diff
-version:             1.0.12
+version:             1.0.13
 synopsis:            Explain why two Nix derivations differ
 description:         This package provides a @nix-diff@ executable which
                      explains why two Nix derivations (i.e. @*.drv@ files)
@@ -24,7 +24,7 @@
                      , directory                           < 1.4
                      , mtl                  >= 2.2      && < 2.3
                      , nix-derivation       >= 1.1      && < 1.2
-                     , optparse-applicative >= 0.14.0.0 && < 0.16
+                     , optparse-applicative >= 0.14.0.0 && < 0.17
                      , patience             >= 0.3      && < 0.4
                      , text                 >= 1.2      && < 1.3
                      , unix                                < 2.8
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -64,12 +64,18 @@
             "never"  -> return Never
             _        -> fail "Invalid color"
 
-parseLineOriented :: Parser Bool
+parseLineOriented :: Parser Orientation
 parseLineOriented =
-    Options.Applicative.switch
-        (   Options.Applicative.long "line-oriented"
-        <>  Options.Applicative.help "Display textual differences on a per-line basis instead of a per-character basis"
-        )
+        per "line" Line
+    <|> per "character" Character
+    <|> per "word" Word
+    <|> pure Word
+  where
+    per x orientation =
+        Options.Applicative.flag' orientation
+            (   Options.Applicative.long (x <> "-oriented")
+            <>  Options.Applicative.help ("Display textual differences on a per-" <> x <> " basis")
+            )
 
 parseEnvironment :: Parser Bool
 parseEnvironment =
@@ -79,22 +85,24 @@
         )
 
 data Options = Options
-    { left         :: FilePath
-    , right        :: FilePath
-    , color        :: Color
-    , lineOriented :: Bool
-    , environment  :: Bool
+    { left        :: FilePath
+    , right       :: FilePath
+    , color       :: Color
+    , orientation :: Orientation
+    , environment :: Bool
     }
 
+data Orientation = Character | Word | Line
+
 parseOptions :: Parser Options
 parseOptions = do
-    left         <- parseLeft
-    right        <- parseRight
-    color        <- parseColor
-    lineOriented <- parseLineOriented
-    environment  <- parseEnvironment
+    left        <- parseLeft
+    right       <- parseRight
+    color       <- parseColor
+    orientation <- parseLineOriented
+    environment <- parseEnvironment
 
-    return (Options { left, right, color, lineOriented, environment })
+    return (Options { left, right, color, orientation, environment })
   where
     parseFilePath metavar = do
         Options.Applicative.strArgument
@@ -113,10 +121,10 @@
         )
 
 data Context = Context
-    { tty          :: TTY
-    , indent       :: Natural
-    , lineOriented :: Bool
-    , environment  :: Bool
+    { tty         :: TTY
+    , indent      :: Natural
+    , orientation :: Orientation
+    , environment :: Bool
     }
 
 newtype Status = Status { visited :: Set Diffed }
@@ -228,11 +236,13 @@
 red NotTTY text = text
 
 -- | Color text background red
-redBackground  :: Bool -> TTY -> Text -> Text
-redBackground False IsTTY  text = "\ESC[41m" <> text <> "\ESC[0m"
-redBackground True  IsTTY  text = "\ESC[41m" <> text <> "\ESC[0m\n"
-redBackground False NotTTY text = "←" <> text <> "←"
-redBackground True  NotTTY text = "- " <> text <> "\n"
+redBackground  :: Orientation -> TTY -> Text -> Text
+redBackground Character IsTTY  text = "\ESC[41m" <> text <> "\ESC[0m"
+redBackground Word      IsTTY  text = "\ESC[41m" <> text <> " \ESC[0m"
+redBackground Line      IsTTY  text = "\ESC[41m" <> text <> "\ESC[0m\n"
+redBackground Character NotTTY text = "←" <> text <> "←"
+redBackground Word      NotTTY text = "←" <> text <> " ←"
+redBackground Line      NotTTY text = "- " <> text <> "\n"
 
 -- | Color text green
 green :: TTY -> Text -> Text
@@ -240,18 +250,22 @@
 green NotTTY text = text
 
 -- | Color text background green
-greenBackground :: Bool -> TTY -> Text -> Text
-greenBackground False IsTTY  text = "\ESC[42m" <> text <> "\ESC[0m"
-greenBackground True  IsTTY  text = "\ESC[42m" <> text <> "\ESC[0m\n"
-greenBackground False NotTTY text = "→" <> text <> "→"
-greenBackground True  NotTTY text = "+ " <> text <> "\n"
+greenBackground :: Orientation -> TTY -> Text -> Text
+greenBackground Character IsTTY  text = "\ESC[42m" <> text <> "\ESC[0m"
+greenBackground Word      IsTTY  text = "\ESC[42m" <> text <> " \ESC[0m"
+greenBackground Line      IsTTY  text = "\ESC[42m" <> text <> "\ESC[0m\n"
+greenBackground Character NotTTY text = "→" <> text <> "→"
+greenBackground Word      NotTTY text = "→" <> text <> " →"
+greenBackground Line      NotTTY text = "+ " <> text <> "\n"
 
 -- | Color text grey
-grey :: Bool -> TTY -> Text -> Text
-grey False  IsTTY text = "\ESC[1;2m" <> text <> "\ESC[0m"
-grey True   IsTTY text = "\ESC[1;2m" <> text <> "\ESC[0m\n"
-grey False NotTTY text = text
-grey True  NotTTY text = "  " <> text <> "\n"
+grey :: Orientation -> TTY -> Text -> Text
+grey Character IsTTY  text = "\ESC[1;2m" <> text <> "\ESC[0m"
+grey Word      IsTTY  text = "\ESC[1;2m" <> text <> " \ESC[0m"
+grey Line      IsTTY  text = "\ESC[1;2m" <> text <> "\ESC[0m\n"
+grey Character NotTTY text = text
+grey Word      NotTTY text = text <> " "
+grey Line      NotTTY text = "  " <> text <> "\n"
 
 -- | Format the left half of a diff
 minus :: TTY -> Text -> Text
@@ -375,22 +389,27 @@
     -- ^ Right value to compare
     -> Diff Text
 diffText left right = do
-    Context { indent, lineOriented, tty } <- ask
+    Context{ indent, orientation, tty } <- ask
+
     let n = fromIntegral indent
 
     let leftString  = Data.Text.unpack left
     let rightString = Data.Text.unpack right
 
+    let leftWords  = Data.Text.splitOn " " left
+    let rightWords = Data.Text.splitOn " " right
+
     let leftLines  = Data.Text.lines left
     let rightLines = Data.Text.lines right
 
     let chunks =
-            if lineOriented
-                then
-                    Patience.diff leftLines rightLines
-                else
+            case orientation of
+                Character ->
                     fmap (mapDiff Data.Text.pack) (getGroupedDiff leftString rightString)
-
+                Word ->
+                    Patience.diff leftWords rightWords
+                Line ->
+                    Patience.diff leftLines rightLines
     let prefix = Data.Text.replicate n " "
 
     let format text =
@@ -404,11 +423,11 @@
                 indentLine line = prefix <> "    " <> line
 
     let renderChunk (Patience.Old  l  ) =
-            redBackground   lineOriented tty l
+            redBackground   orientation tty l
         renderChunk (Patience.New    r) =
-            greenBackground lineOriented tty r
+            greenBackground orientation tty r
         renderChunk (Patience.Both l _) =
-            grey            lineOriented tty l
+            grey            orientation tty l
 
     return (format (Data.Text.concat (fmap renderChunk chunks)))
 
@@ -633,7 +652,7 @@
 main = do
     GHC.IO.Encoding.setLocaleEncoding GHC.IO.Encoding.utf8
 
-    Options { left, right, color, lineOriented, environment } <- Options.Applicative.execParser parserInfo
+    Options { left, right, color, orientation, environment } <- Options.Applicative.execParser parserInfo
 
     tty <- case color of
         Never -> do
@@ -645,7 +664,7 @@
             return (if b then IsTTY else NotTTY)
 
     let indent = 0
-    let context = Context { tty, indent, lineOriented, environment }
+    let context = Context { tty, indent, orientation, environment }
     let status = Status Data.Set.empty
     let action = diff True left (Data.Set.singleton "out") right (Data.Set.singleton "out")
     Control.Monad.State.evalStateT (Control.Monad.Reader.runReaderT (unDiff action) context) status
