diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+1.5.1
+
+* GHC 8.4 support
+* Re-export `encodeString`/`decodeString`
+* Update tutorial to use `stack script`
+* Increase upper bounds on dependencies
+
 1.5.0
 
 * BREAKING CHANGE: Add `MonadCatch` instance for `Shell`
diff --git a/src/Turtle.hs b/src/Turtle.hs
--- a/src/Turtle.hs
+++ b/src/Turtle.hs
@@ -141,6 +141,8 @@
     , splitExtension
     , toText
     , fromText
+    , encodeString
+    , decodeString
     )
 import Control.Monad.Managed (Managed, managed, runManaged, with)
 import Control.Foldl (Fold(..), FoldM(..))
diff --git a/src/Turtle/Line.hs b/src/Turtle/Line.hs
--- a/src/Turtle/Line.hs
+++ b/src/Turtle/Line.hs
@@ -62,6 +62,11 @@
 newtype Line = Line Text
   deriving (Eq, Ord, Show, Monoid)
 
+#if __GLASGOW_HASKELL__ >= 804
+instance Semigroup Line where
+  (<>) = mappend
+#endif
+
 instance IsString Line where
   fromString = fromMaybe (throw NewlineForbidden) . textToLine . fromString
 
diff --git a/src/Turtle/Pattern.hs b/src/Turtle/Pattern.hs
--- a/src/Turtle/Pattern.hs
+++ b/src/Turtle/Pattern.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP                        #-}
 {-# LANGUAGE OverloadedStrings          #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE TypeFamilies               #-}
@@ -122,6 +123,11 @@
 -- | A fully backtracking pattern that parses an @\'a\'@ from some `Text`
 newtype Pattern a = Pattern { runPattern :: StateT Text [] a }
     deriving (Functor, Applicative, Monad, Alternative, MonadPlus)
+
+#if __GLASGOW_HASKELL__ >= 804
+instance Monoid a => Semigroup (Pattern a) where
+  (<>) = mappend
+#endif
 
 instance Monoid a => Monoid (Pattern a) where
     mempty  = pure mempty
diff --git a/src/Turtle/Shell.hs b/src/Turtle/Shell.hs
--- a/src/Turtle/Shell.hs
+++ b/src/Turtle/Shell.hs
@@ -207,6 +207,11 @@
     fail = Prelude.fail
 #endif
 
+#if __GLASGOW_HASKELL__ >= 804
+instance Monoid a => Semigroup (Shell a) where
+  (<>) = mappend
+#endif
+
 instance Monoid a => Monoid (Shell a) where
     mempty  = pure mempty
     mappend = liftA2 mappend
diff --git a/src/Turtle/Tutorial.hs b/src/Turtle/Tutorial.hs
--- a/src/Turtle/Tutorial.hs
+++ b/src/Turtle/Tutorial.hs
@@ -47,7 +47,7 @@
     can install a Haskell compiler if one is not already present.
     If you are curious about how these two lines work, they are described here:
 
-    <https://github.com/commercialhaskell/stack/blob/master/doc/GUIDE.md#ghcrunghc>
+    <https://github.com/commercialhaskell/stack/blob/master/doc/GUIDE.md#script-interpreter>
 
     If you want to make a Windows script independently executable outside of a
     Git Bash environment, you can either (A) compile the script into an
@@ -129,7 +129,7 @@
 --
 -- @
 -- #!\/usr\/bin\/env stack
--- \-\- stack \-\-install-ghc runghc \-\-package turtle
+-- \-\- stack \-\-resolver lts-10.2 script
 -- \ 
 --                                     -- #!\/bin\/bash
 -- {-\# LANGUAGE OverloadedStrings \#-}  --
@@ -194,7 +194,7 @@
 -- difference:
 --
 -- > #!/usr/bin/env stack
--- > -- stack --install-ghc runghc --package turtle
+-- > -- stack --resolver lts-10.2 script
 -- >
 -- >                                     -- #!/bin/bash
 -- > {-# LANGUAGE OverloadedStrings #-}  --
@@ -211,7 +211,7 @@
 -- program this way instead:
 --
 -- > #!/usr/bin/env stack
--- > -- stack --install-ghc runghc --package turtle
+-- > -- stack --resolver lts-10.2 script
 -- > 
 -- > {-# LANGUAGE OverloadedStrings #-}
 -- > 
@@ -227,7 +227,7 @@
 -- permits definitions.  If you were to insert a statement at the top-level:
 --
 -- > #!/usr/bin/env stack
--- > -- stack --install-ghc runghc --package turtle
+-- > -- stack --resolver lts-10.2 script
 -- > 
 -- > {-# LANGUAGE OverloadedStrings #-}
 -- > 
@@ -244,7 +244,7 @@
 -- command:
 --
 -- > #!/usr/bin/env stack
--- > -- stack --install-ghc runghc --package turtle
+-- > -- stack --resolver lts-10.2 script
 -- >
 -- >                                     -- #!/bin/bash
 -- > {-# LANGUAGE OverloadedStrings #-}  --
@@ -270,7 +270,7 @@
 --
 -- @
 -- #!\/usr\/bin\/env stack
--- \-\- stack \-\-install-ghc runghc \-\-package turtle
+-- \-\- stack \-\-resolver lts-10.2 script
 -- \ 
 --                            -- #!\/bin\/bash
 -- import Turtle              --
@@ -298,7 +298,7 @@
 -- within a larger subroutine:
 --
 -- > #!/usr/bin/env stack
--- > -- stack --install-ghc runghc --package turtle
+-- > -- stack --resolver lts-10.2 script
 -- >
 -- >                             -- #!/bin/bash
 -- > import Turtle               --
@@ -360,7 +360,7 @@
 -- following script to find out what happens if we choose `echo` instead:
 --
 -- > #!/usr/bin/env stack
--- > -- stack --install-ghc runghc --package turtle
+-- > -- stack --resolver lts-10.2 script
 -- > 
 -- > import Turtle
 -- > 
@@ -567,7 +567,7 @@
 -- Let's illustrate this by adding types to our original script:
 --
 -- > #!/usr/bin/env stack
--- > -- stack --install-ghc runghc --package turtle
+-- > -- stack --resolver lts-10.2 script
 -- > 
 -- > import Turtle
 -- > 
@@ -605,7 +605,7 @@
 -- can define unadorned `Line` values at the top-level, as we saw previously:
 --
 -- > #!/usr/bin/env stack
--- > -- stack --install-ghc runghc --package turtle
+-- > -- stack --resolver lts-10.2 script
 -- > 
 -- > {-# LANGUAGE OverloadedStrings #-}
 -- > 
@@ -625,7 +625,7 @@
 -- Let's test this out by providing an incorrect type for @\'str\'@:
 --
 -- > #!/usr/bin/env stack
--- > -- stack --install-ghc runghc --package turtle
+-- > -- stack --resolver lts-10.2 script
 -- > 
 -- > {-# LANGUAGE OverloadedStrings #-}
 -- > 
@@ -677,7 +677,7 @@
 -- a string:
 --
 -- > #!/usr/bin/env stack
--- > -- stack --install-ghc runghc --package turtle
+-- > -- stack --resolver lts-10.2 script
 -- > 
 -- > {-# LANGUAGE OverloadedStrings #-}
 -- > 
@@ -713,7 +713,7 @@
 --
 -- @
 -- #!\/usr\/bin\/env stack
--- \-\- stack \-\-install-ghc runghc \-\-package turtle
+-- \-\- stack \-\-resolver lts-10.2 script
 -- \ 
 --                                              -- #!\/bin\/bash
 -- {-\# LANGUAGE OverloadedStrings \#-}           --
@@ -758,7 +758,7 @@
 --
 -- @
 -- #!\/usr\/bin\/env stack
--- \-\- stack \-\-install-ghc runghc \-\-package turtle
+-- \-\- stack \-\-resolver lts-10.2 script
 -- 
 -- {-\# LANGUAGE OverloadedStrings \#-}
 -- 
@@ -1031,7 +1031,7 @@
 -- We can use `select` to implement loops within a `Shell`:
 --
 -- > #!/usr/bin/env stack
--- > -- stack --install-ghc runghc --package turtle
+-- > -- stack --resolver lts-10.2 script
 -- > 
 -- >                                     -- #!/bin/bash
 -- > {-# LANGUAGE OverloadedStrings #-}  --
@@ -1178,7 +1178,7 @@
 -- to standard output:
 --
 -- > #!/usr/bin/env stack
--- > -- stack --install-ghc runghc --package turtle
+-- > -- stack --resolver lts-10.2 script
 -- > 
 -- >                                     -- #!/bin/bash
 -- > {-# LANGUAGE OverloadedStrings #-}  --
@@ -1419,7 +1419,7 @@
 -- a `Shell`:
 --
 -- > #!/usr/bin/env stack
--- > -- stack --install-ghc runghc --package turtle
+-- > -- stack --resolver lts-10.2 script
 -- > 
 -- > {-# LANGUAGE OverloadedStrings #-}
 -- > 
@@ -1445,7 +1445,7 @@
 -- file and directory are still cleaned up correctly:
 --
 -- > #!/usr/bin/env stack
--- > -- stack --install-ghc runghc --package turtle
+-- > -- stack --resolver lts-10.2 script
 -- > 
 -- > {-# LANGUAGE OverloadedStrings #-}
 -- > 
@@ -1509,7 +1509,7 @@
 -- to:
 --
 -- > #!/usr/bin/env stack
--- > -- stack --install-ghc runghc --package turtle
+-- > -- stack --resolver lts-10.2 script
 -- > 
 -- > {-# LANGUAGE OverloadedStrings #-}
 -- > 
@@ -1536,7 +1536,7 @@
 -- positional arguments for the source and destination file, you can write:
 --
 -- > #!/usr/bin/env stack
--- > -- stack --install-ghc runghc --package turtle
+-- > -- stack --resolver lts-10.2 script
 -- >
 -- > -- cp.hs
 -- >
@@ -1601,7 +1601,7 @@
 --
 --
 -- > #!/usr/bin/env stack
--- > -- stack --install-ghc runghc --package turtle
+-- > -- stack --resolver lts-10.2 script
 -- > 
 -- > {-# LANGUAGE OverloadedStrings #-}
 -- > 
@@ -1650,7 +1650,7 @@
 -- as short-hands for the flags:
 --
 -- > #!/usr/bin/env stack
--- > -- stack --install-ghc runghc --package turtle
+-- > -- stack --resolver lts-10.2 script
 -- > 
 -- > {-# LANGUAGE OverloadedStrings #-}
 -- > 
diff --git a/turtle.cabal b/turtle.cabal
--- a/turtle.cabal
+++ b/turtle.cabal
@@ -1,5 +1,5 @@
 Name: turtle
-Version: 1.5.0
+Version: 1.5.1
 Cabal-Version: >=1.10
 Build-Type: Simple
 License: BSD3
@@ -73,7 +73,7 @@
         optional-args        >= 1.0     && < 2.0 ,
         unix-compat          >= 0.4     && < 0.6
     if os(windows)
-        Build-Depends: Win32 >= 2.2.0.1 && < 2.4
+        Build-Depends: Win32 >= 2.2.0.1 && < 2.6
     else
         Build-Depends: unix  >= 2.5.1.0 && < 2.8
     Exposed-Modules:
@@ -146,4 +146,4 @@
     if impl(ghc < 7.8)
         Build-Depends: criterion >= 0.4 && < 1.1.4.0
     else
-        Build-Depends: criterion >= 0.4 && < 1.3
+        Build-Depends: criterion >= 0.4 && < 1.4
