diff --git a/.travis.yml b/.travis.yml
--- a/.travis.yml
+++ b/.travis.yml
@@ -12,21 +12,21 @@
 
 matrix:
   include:
-    - env: CABALVER=1.16 GHCVER=7.4.2
+    - env: CABALVER=1.24 GHCVER=7.4.2
       compiler: ": #GHC 7.4.2"
-      addons: {apt: {packages: [cabal-install-1.16,ghc-7.4.2,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}
-    - env: CABALVER=1.16 GHCVER=7.6.3
+      addons: {apt: {packages: [cabal-install-1.24,ghc-7.4.2,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}
+    - env: CABALVER=1.24 GHCVER=7.6.3
       compiler: ": #GHC 7.6.3"
-      addons: {apt: {packages: [cabal-install-1.16,ghc-7.6.3,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}
-    - env: CABALVER=1.18 GHCVER=7.8.4
+      addons: {apt: {packages: [cabal-install-1.24,ghc-7.6.3,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}
+    - env: CABALVER=1.24 GHCVER=7.8.4
       compiler: ": #GHC 7.8.4"
-      addons: {apt: {packages: [cabal-install-1.18,ghc-7.8.4,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}
-    - env: CABALVER=1.22 GHCVER=7.10.1
-      compiler: ": #GHC 7.10.1"
-      addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.1,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}
-    - env: CABALVER=1.22 GHCVER=7.10.2
-      compiler: ": #GHC 7.10.2"
-      addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.2,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}
+      addons: {apt: {packages: [cabal-install-1.24,ghc-7.8.4,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}
+    - env: CABALVER=1.24 GHCVER=7.10.3
+      compiler: ": #GHC 7.10.3"
+      addons: {apt: {packages: [cabal-install-1.24,ghc-7.10.3,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}
+    - env: CABALVER=1.24 GHCVER=8.0.2
+      compiler: ": #GHC 8.0.2"
+      addons: {apt: {packages: [cabal-install-1.24,ghc-8.0.2,alex-3.1.4,happy-1.19.5], sources: [hvr-ghc]}}
 
 before_install:
  - unset CC
@@ -59,7 +59,6 @@
      rm -rf $HOME/.cabsnap;
      mkdir -p $HOME/.ghc $HOME/.cabal/lib $HOME/.cabal/share $HOME/.cabal/bin;
      cabal install --only-dependencies --enable-tests --enable-benchmarks;
-     if [ "$GHCVER" = "7.10.1" ]; then cabal install Cabal-1.22.4.0; fi;
    fi
 
 # snapshot package-db on cache miss
diff --git a/src/Text/Trifecta/Combinators.hs b/src/Text/Trifecta/Combinators.hs
--- a/src/Text/Trifecta/Combinators.hs
+++ b/src/Text/Trifecta/Combinators.hs
@@ -56,14 +56,14 @@
   -- | Run a parser, grabbing all of the text between its start and end points
   slicedWith :: (a -> Strict.ByteString -> r) -> m a -> m r
 
-  -- | Retrieve a 'Rendering' of the current linem noting this position, but not
+  -- | Retrieve a 'Rendering' of the current line noting this position, but not
   -- placing a 'Caret' there.
-  rend :: DeltaParsing m => m Rendering
+  rend :: m Rendering
   rend = rendered <$> position <*> line
   {-# INLINE rend #-}
 
   -- | Grab the remainder of the current line
-  restOfLine :: DeltaParsing m => m ByteString
+  restOfLine :: m ByteString
   restOfLine = Strict.drop . fromIntegral . columnByte <$> position <*> line
   {-# INLINE restOfLine #-}
 
diff --git a/src/Text/Trifecta/Parser.hs b/src/Text/Trifecta/Parser.hs
--- a/src/Text/Trifecta/Parser.hs
+++ b/src/Text/Trifecta/Parser.hs
@@ -60,6 +60,40 @@
 import Text.Trifecta.Delta as Delta
 import Text.Trifecta.Util.It
 
+-- | The type of a trifecta parser
+--
+-- The first four arguments are behavior continuations:
+--
+--   * epsilon success: the parser has consumed no input and has a result
+--     as well as a possible Err; the position and chunk are unchanged
+--     (see `pure`)
+--
+--   * epsilon failure: the parser has consumed no input and is failing
+--     with the given Err; the position and chunk are unchanged (see
+--     `empty`)
+--
+--   * committed success: the parser has consumed input and is yielding
+--     the result, set of expected strings that would have permitted this
+--     parse to continue, new position, and residual chunk to the
+--     continuation.
+--
+--   * committed failure: the parser has consumed input and is failing with
+--     a given ErrInfo (user-facing error message)
+--
+-- The remaining two arguments are
+--
+--   * the current position
+--
+--   * the chunk of input currently under analysis
+--
+-- `Parser` is an `Alternative`; trifecta's backtracking behavior encoded as
+-- `<|>` is to behave as the leftmost parser which yields a value
+-- (regardless of any input being consumed) or which consumes input and
+-- fails.  That is, a choice of parsers will only yield an epsilon failure
+-- if *all* parsers in the choice do.  If that is not the desired behavior,
+-- see `try`, which turns a committed parser failure into an epsilon failure
+-- (at the cost of error information).
+--
 newtype Parser a = Parser
   { unparser :: forall r.
     (a -> Err -> It Rope r) ->
@@ -105,15 +139,34 @@
   return a = Parser $ \ eo _ _ _ _ _ -> eo a mempty
   {-# INLINE return #-}
   Parser m >>= k = Parser $ \ eo ee co ce d bs ->
-    m (\a e -> unparser (k a) (\b e' -> eo b (e <> e')) (\e' -> ee (e <> e')) co ce d bs) ee
+    m -- epsilon result: feed result to monadic continutaion; committed
+      -- continuations as they were given to us; epsilon callbacks merge
+      -- error information with `<>`
+      (\a e -> unparser (k a) (\b e' -> eo b (e <> e')) (\e' -> ee (e <> e')) co ce d bs)
+      -- epsilon error: as given
+      ee
+      -- committed result: feed result to monadic continuation and...
       (\a es d' bs' -> unparser (k a)
+         -- epsilon results are now committed results due to m consuming.
+         --
+         -- epsilon success is now committed success at the new position
+         -- (after m), yielding the result from (k a) and merging the
+         -- expected sets (i.e. things that could have resulted in a longer
+         -- parse)
          (\b e' -> co b (es <> _expected e') d' bs')
+         -- epsilon failure is now a committed failure at the new position
+         -- (after m); compute the error to display to the user
          (\e ->
            let errDoc = explain (renderingCaret d' bs') e { _expected = _expected e <> es }
                errDelta = _finalDeltas e
            in  ce $ ErrInfo errDoc (d' : errDelta)
          )
-         co ce d' bs') ce d bs
+         -- committed behaviors as given; nothing exciting here
+         co ce
+         -- new position and remaining chunk after m
+         d' bs')
+      -- committed error, delta, and bytestring: as given
+      ce d bs
   {-# INLINE (>>=) #-}
   (>>) = (*>)
   {-# INLINE (>>) #-}
diff --git a/trifecta.cabal b/trifecta.cabal
--- a/trifecta.cabal
+++ b/trifecta.cabal
@@ -1,6 +1,6 @@
 name:          trifecta
 category:      Text, Parsing, Diagnostics, Pretty Printer, Logging
-version:       1.6
+version:       1.6.1
 license:       BSD3
 cabal-version: >= 1.10
 license-file:  LICENSE
