diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,15 @@
 
+0.4
+===
+
+Bug fixes:
+ * Fixed a bug where each line was being wrapped after every word
+   because only one case in breakTokens was reached (thanks Callum
+   Oakley)
+
+Package changes:
+ * Added a simple benchmark suite
+
 0.3.3
 =====
 
diff --git a/benchmarks/Main.hs b/benchmarks/Main.hs
new file mode 100644
--- /dev/null
+++ b/benchmarks/Main.hs
@@ -0,0 +1,44 @@
+{-# LANGUAGE OverloadedStrings #-}
+module Main where
+
+import Criterion.Main
+import qualified Data.Text as T
+
+import Text.Wrap
+
+smallDocument :: T.Text
+smallDocument =
+    T.unlines $
+    replicate 10 $
+    T.concat $
+    replicate 1000 "foobar stuff things x "
+
+mediumDocument :: T.Text
+mediumDocument =
+    T.unlines $
+    replicate 100 $
+    T.concat $
+    replicate 1000 "foobar stuff things x "
+
+largeDocument :: T.Text
+largeDocument =
+    T.unlines $
+    replicate 1000 $
+    T.concat $
+    replicate 1000 "foobar stuff things x "
+
+breakSettings :: WrapSettings
+breakSettings = defaultWrapSettings { breakLongWords = True }
+
+cases :: [Benchmark]
+cases =
+    [ bench "small_default"  $ nf (wrapTextToLines defaultWrapSettings 10) smallDocument
+    , bench "medium_default" $ nf (wrapTextToLines defaultWrapSettings 10) mediumDocument
+    , bench "large_deafult"  $ nf (wrapTextToLines defaultWrapSettings 10) largeDocument
+    , bench "small_break"    $ nf (wrapTextToLines breakSettings 5) smallDocument
+    , bench "medium_break"   $ nf (wrapTextToLines breakSettings 5) mediumDocument
+    , bench "large_break"    $ nf (wrapTextToLines breakSettings 5) largeDocument
+    ]
+
+main :: IO ()
+main = defaultMain cases
diff --git a/src/Text/Wrap.hs b/src/Text/Wrap.hs
--- a/src/Text/Wrap.hs
+++ b/src/Text/Wrap.hs
@@ -17,8 +17,8 @@
                  -- ^ Whether to indent new lines created by wrapping
                  -- when their original line was indented.
                  , breakLongWords :: Bool
-                 -- ^ Whether to break in the middle of individual words
-                 -- when not doing so would result in a long line.
+                 -- ^ Whether to break in the middle of the first word
+                 -- on a line when that word exceeds the wrapping width.
                  }
                  deriving (Eq, Show, Read)
 
@@ -99,13 +99,9 @@
     -- Take enough tokens until we reach the point where taking more
     -- would exceed the line length.
     let go _ []     = ([], [])
-        go 0 (t@(NonWS _):toks) =
-            if tokenLength t <= limit
-            then ([t], toks)
-            else if not $ breakLongWords settings
-                 then ([t], toks)
-                 else let (h, tl) = T.splitAt limit (tokenContent t)
-                      in ([NonWS h], NonWS tl : toks)
+        -- Check to see whether the next token exceeds the limit. If so, bump
+        -- it to the next line and terminate. Otherwise keep it and continue to
+        -- the next token.
         go acc (tok:toks) =
             if tokenLength tok + acc <= limit
             then let (nextAllowed, nextDisallowed) = go (acc + tokenLength tok) toks
@@ -113,8 +109,10 @@
             else case tok of
                      WS _ -> ([], toks)
                      NonWS _ ->
-                         if acc == 0
-                         then ([tok], toks)
+                         if acc == 0 && breakLongWords settings
+                         then let (h, tl) = T.splitAt limit (tokenContent tok)
+                              in ([NonWS h], NonWS tl : toks)
+                         else if acc == 0 then ([tok], toks)
                          else ([], tok:toks)
 
         -- Allowed tokens are the ones we keep on this line. The rest go
diff --git a/tests/Main.hs b/tests/Main.hs
--- a/tests/Main.hs
+++ b/tests/Main.hs
@@ -8,8 +8,8 @@
 main :: IO ()
 main = hspec $ do
     it "leaves short lines untouched" $ do
-      wrapTextToLines defaultWrapSettings 5 "foo"
-        `shouldBe` ["foo"]
+      wrapTextToLines defaultWrapSettings 7 "foo bar"
+        `shouldBe` ["foo bar"]
 
     it "wraps long lines" $ do
       wrapTextToLines defaultWrapSettings 7 "Hello, World!"
diff --git a/word-wrap.cabal b/word-wrap.cabal
--- a/word-wrap.cabal
+++ b/word-wrap.cabal
@@ -1,5 +1,5 @@
 name:                word-wrap
-version:             0.3.3
+version:             0.4
 synopsis:            A library for word-wrapping
 description:         A library for wrapping long lines of text.
 license:             BSD3
@@ -29,6 +29,17 @@
   default-language:    Haskell2010
   ghc-options:         -Wall
   build-depends:       base < 5,
+                       text
+
+benchmark word-wrap-benchmarks
+  type:                exitcode-stdio-1.0
+  default-language:    Haskell2010
+  hs-source-dirs:      benchmarks
+  main-is:             Main.hs
+  ghc-options:         -Wall
+  build-depends:       base < 5,
+                       word-wrap,
+                       criterion,
                        text
 
 test-suite word-wrap-tests
