diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+1.5.14
+
+* Fix `cptree` to copy symlinks instead of descending into them
+    * See: https://github.com/Gabriel439/Haskell-Turtle-Library/pull/344
+* Build against newer versions of `Win32` package
+
 1.5.13
 
 * Fix `chmod` bug
diff --git a/src/Turtle/Prelude.hs b/src/Turtle/Prelude.hs
--- a/src/Turtle/Prelude.hs
+++ b/src/Turtle/Prelude.hs
@@ -130,6 +130,7 @@
 #if !defined(mingw32_HOST_OS)
     , symlink
 #endif
+    , isNotSymbolicLink
     , rm
     , rmdir
     , rmtree
@@ -1095,20 +1096,46 @@
   
 #endif
 
+{-| Returns `True` if the given `FilePath` is not a symbolic link
+
+    This comes in handy in conjunction with `lsif`:
+
+    > lsif isNotSymbolicLink
+-}
+isNotSymbolicLink :: MonadIO io => FilePath -> io Bool
+isNotSymbolicLink = fmap (not . PosixCompat.isSymbolicLink) . lstat
+
 -- | Copy a directory tree
 cptree :: MonadIO io => FilePath -> FilePath -> io ()
 cptree oldTree newTree = sh (do
-    oldPath <- lstree oldTree
+    oldPath <- lsif isNotSymbolicLink oldTree
+
     -- The `system-filepath` library treats a path like "/tmp" as a file and not
     -- a directory and fails to strip it as a prefix from `/tmp/foo`.  Adding
     -- `(</> "")` to the end of the path makes clear that the path is a
     -- directory
     Just suffix <- return (Filesystem.stripPrefix (oldTree </> "") oldPath)
+
     let newPath = newTree </> suffix
+
     isFile <- testfile oldPath
-    if isFile
-        then mktree (Filesystem.directory newPath) >> cp oldPath newPath
-        else mktree newPath )
+
+    fileStatus <- lstat oldPath
+
+    if PosixCompat.isSymbolicLink fileStatus
+        then do
+            oldTarget <- liftIO (PosixCompat.readSymbolicLink (Filesystem.encodeString oldPath))
+
+            mktree (Filesystem.directory newPath)
+
+            liftIO (PosixCompat.createSymbolicLink oldTarget (Filesystem.encodeString newPath))
+        else if isFile
+        then do
+            mktree (Filesystem.directory newPath)
+
+            cp oldPath newPath
+        else do
+            mktree newPath )
 
 -- | Remove a file
 rm :: MonadIO io => FilePath -> io ()
diff --git a/turtle.cabal b/turtle.cabal
--- a/turtle.cabal
+++ b/turtle.cabal
@@ -1,5 +1,5 @@
 Name: turtle
-Version: 1.5.13
+Version: 1.5.14
 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.6
+        Build-Depends: Win32 >= 2.2.0.1 && < 2.9
     else
         Build-Depends: unix  >= 2.5.1.0 && < 2.8
     Exposed-Modules:
