diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+## Zip 2.0.1
+
+* Fixed corruption of large entries when zip64 is used. [Issue
+  111](https://github.com/mrkkrp/zip/issues/111).
+
 ## Zip 2.0.0
 
 * Unified `BZip2Unsupported` and `ZstdUnsupported` into a single data
diff --git a/Codec/Archive/Zip.hs b/Codec/Archive/Zip.hs
--- a/Codec/Archive/Zip.hs
+++ b/Codec/Archive/Zip.hs
@@ -146,7 +146,7 @@
   )
 where
 
-import qualified Codec.Archive.Zip.Internal as I
+import Codec.Archive.Zip.Internal qualified as I
 import Codec.Archive.Zip.Type
 import Conduit (PrimMonad)
 import Control.Monad
@@ -157,22 +157,22 @@
 import Control.Monad.Trans.Resource (MonadResource, ResourceT)
 import Data.ByteString (ByteString)
 import Data.Conduit (ConduitT, (.|))
-import qualified Data.Conduit as C
-import qualified Data.Conduit.Binary as CB
-import qualified Data.Conduit.List as CL
-import qualified Data.DList as DList
+import Data.Conduit qualified as C
+import Data.Conduit.Binary qualified as CB
+import Data.Conduit.List qualified as CL
+import Data.DList qualified as DList
 import Data.Map.Strict (Map, (!))
-import qualified Data.Map.Strict as M
+import Data.Map.Strict qualified as M
 import Data.Sequence (Seq, (|>))
-import qualified Data.Sequence as S
-import qualified Data.Set as E
+import Data.Sequence qualified as S
+import Data.Set qualified as E
 import Data.Text (Text)
 import Data.Time.Clock (UTCTime)
 import Data.Void
 import Data.Word (Word16, Word32)
 import System.Directory
 import System.FilePath ((</>))
-import qualified System.FilePath as FP
+import System.FilePath qualified as FP
 import System.IO.Error (isDoesNotExistError)
 
 #ifndef mingw32_HOST_OS
diff --git a/Codec/Archive/Zip/CP437.hs b/Codec/Archive/Zip/CP437.hs
--- a/Codec/Archive/Zip/CP437.hs
+++ b/Codec/Archive/Zip/CP437.hs
@@ -15,10 +15,10 @@
 
 import Control.Arrow (first)
 import Data.ByteString (ByteString)
-import qualified Data.ByteString as B
+import Data.ByteString qualified as B
 import Data.Char
 import Data.Text (Text)
-import qualified Data.Text as T
+import Data.Text qualified as T
 import Data.Word (Word8)
 
 -- | Decode a 'ByteString' containing CP 437 encoded text.
diff --git a/Codec/Archive/Zip/Internal.hs b/Codec/Archive/Zip/Internal.hs
--- a/Codec/Archive/Zip/Internal.hs
+++ b/Codec/Archive/Zip/Internal.hs
@@ -35,26 +35,26 @@
 import Data.Bits
 import Data.Bool (bool)
 import Data.ByteString (ByteString)
-import qualified Data.ByteString as B
+import Data.ByteString qualified as B
 import Data.Char (ord)
 import Data.Conduit (ConduitT, ZipSink (..), (.|))
-import qualified Data.Conduit as C
-import qualified Data.Conduit.Binary as CB
-import qualified Data.Conduit.List as CL
-import qualified Data.Conduit.Zlib as Z
+import Data.Conduit qualified as C
+import Data.Conduit.Binary qualified as CB
+import Data.Conduit.List qualified as CL
+import Data.Conduit.Zlib qualified as Z
 import Data.Digest.CRC32 (crc32Update)
 import Data.Fixed (Fixed (..))
 import Data.Foldable (foldl')
 import Data.Map.Strict (Map, (!))
-import qualified Data.Map.Strict as M
+import Data.Map.Strict qualified as M
 import Data.Maybe (catMaybes, fromJust, isNothing)
 import Data.Sequence (Seq, (><), (|>))
-import qualified Data.Sequence as S
+import Data.Sequence qualified as S
 import Data.Serialize
-import qualified Data.Set as E
+import Data.Set qualified as E
 import Data.Text (Text)
-import qualified Data.Text as T
-import qualified Data.Text.Encoding as T
+import Data.Text qualified as T
+import Data.Text.Encoding qualified as T
 import Data.Time
 import Data.Version
 import Data.Void
@@ -779,11 +779,16 @@
   -- | Resulting representation
   ByteString
 makeZip64ExtraField headerType Zip64ExtraField {..} = runPut $ do
-  when (headerType == LocalHeader || z64efUncompressedSize >= ffffffff) $
-    putWord64le (fromIntegral z64efUncompressedSize) -- uncompressed size
-  when (headerType == LocalHeader || z64efCompressedSize >= ffffffff) $
-    putWord64le (fromIntegral z64efCompressedSize) -- compressed size
-  when (headerType == CentralDirHeader && z64efOffset >= ffffffff) $
+  case headerType of
+    LocalHeader -> do
+      putWord64le (fromIntegral z64efUncompressedSize) -- uncompressed size
+      putWord64le (fromIntegral z64efCompressedSize) -- compressed size
+    CentralDirHeader -> do
+      when (z64efUncompressedSize >= ffffffff) $
+        putWord64le (fromIntegral z64efUncompressedSize) -- uncompressed size
+      when (z64efCompressedSize >= ffffffff) $
+        putWord64le (fromIntegral z64efCompressedSize) -- compressed size
+  when (z64efOffset >= ffffffff) $
     putWord64le (fromIntegral z64efOffset) -- offset of local file header
 
 -- | Create 'ByteString' representing an extra field.
@@ -810,7 +815,8 @@
   EntryDescription ->
   Put
 putHeader headerType s entry@EntryDescription {..} = do
-  let isCentralDirHeader = headerType == CentralDirHeader
+  let isLocalHeader = headerType == LocalHeader
+      isCentralDirHeader = headerType == CentralDirHeader
   putWord32le (bool 0x04034b50 0x02014b50 isCentralDirHeader)
   -- ↑ local/central file header signature
   when isCentralDirHeader $
@@ -842,7 +848,7 @@
             }
       extraField =
         B.take 0xffff . runPut . putExtraField $
-          if needsZip64 entry
+          if needsZip64 entry || isLocalHeader
             then M.insert 1 zip64ef edExtraField
             else edExtraField
   putWord16le (fromIntegral $ B.length extraField) -- extra field length
diff --git a/Codec/Archive/Zip/Type.hs b/Codec/Archive/Zip/Type.hs
--- a/Codec/Archive/Zip/Type.hs
+++ b/Codec/Archive/Zip/Type.hs
@@ -34,25 +34,25 @@
 import Control.Exception (Exception)
 import Control.Monad.Catch (MonadThrow (..))
 import Data.ByteString (ByteString)
-import qualified Data.ByteString as B
+import Data.ByteString qualified as B
 import Data.CaseInsensitive (CI)
-import qualified Data.CaseInsensitive as CI
+import Data.CaseInsensitive qualified as CI
 import Data.Data (Data)
 import Data.List.NonEmpty (NonEmpty)
-import qualified Data.List.NonEmpty as NE
+import Data.List.NonEmpty qualified as NE
 import Data.Map (Map)
 import Data.Maybe (mapMaybe)
 import Data.Text (Text)
-import qualified Data.Text as T
-import qualified Data.Text.Encoding as T
+import Data.Text qualified as T
+import Data.Text.Encoding qualified as T
 import Data.Time.Clock (UTCTime)
 import Data.Typeable (Typeable)
 import Data.Version (Version)
 import Data.Word (Word16, Word32)
 import Numeric.Natural
-import qualified System.FilePath as FP
-import qualified System.FilePath.Posix as Posix
-import qualified System.FilePath.Windows as Windows
+import System.FilePath qualified as FP
+import System.FilePath.Posix qualified as Posix
+import System.FilePath.Windows qualified as Windows
 
 ----------------------------------------------------------------------------
 -- Entry selector
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
 [![Stackage LTS](http://stackage.org/package/zip/badge/lts)](http://stackage.org/lts/package/zip)
 ![CI](https://github.com/mrkkrp/zip/workflows/CI/badge.svg?branch=master)
 
-* [Why this library is written](#why-this-library-is-written)
+* [Why this library was written](#why-this-library-was-written)
     * [zip-archive](#zip-archive)
     * [LibZip](#libzip)
     * [zip-conduit](#zip-conduit)
@@ -22,13 +22,11 @@
 * [License](#license)
 
 This is a feature-rich, memory-efficient, and type-safe library to
-manipulate Zip archives. The library is the most complete and efficient
-implementation of the .ZIP specification in Haskell (at least from the
-open-sourced ones). In particular, it's created with large multimedia data
+manipulate Zip archives. The library was created with large multimedia data
 in mind and provides all features users might expect, comparable in terms of
 feature-set with libraries like `libzip` in C.
 
-## Why this library is written
+## Why this library was written
 
 There are a few libraries to work with Zip archives, yet every one of them
 provides only a subset of useful functionality or otherwise is flawed in
diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,6 +0,0 @@
-module Main (main) where
-
-import Distribution.Simple
-
-main :: IO ()
-main = defaultMain
diff --git a/tests/Main.hs b/tests/Main.hs
--- a/tests/Main.hs
+++ b/tests/Main.hs
@@ -13,26 +13,26 @@
 import Control.Monad.IO.Class
 import Data.Bits
 import Data.ByteString (ByteString)
-import qualified Data.ByteString as B
-import qualified Data.ByteString.Builder as LB
-import qualified Data.ByteString.Lazy as LB
-import qualified Data.Conduit as C
-import qualified Data.Conduit.List as CL
-import qualified Data.DList as DList
+import Data.ByteString qualified as B
+import Data.ByteString.Builder qualified as LB
+import Data.ByteString.Lazy qualified as LB
+import Data.Conduit qualified as C
+import Data.Conduit.List qualified as CL
+import Data.DList qualified as DList
 import Data.List (intercalate)
 import Data.Map (Map, (!))
-import qualified Data.Map.Strict as M
+import Data.Map.Strict qualified as M
 import Data.Maybe (fromJust)
-import qualified Data.Set as E
+import Data.Set qualified as E
 import Data.Text (Text)
-import qualified Data.Text as T
-import qualified Data.Text.Encoding as T
+import Data.Text qualified as T
+import Data.Text.Encoding qualified as T
 import Data.Time
 import Data.Version
 import Data.Word
 import System.Directory
 import System.FilePath ((</>))
-import qualified System.FilePath as FP
+import System.FilePath qualified as FP
 import System.IO
 import System.IO.Error (isDoesNotExistError)
 import System.IO.Temp
@@ -462,7 +462,7 @@
     it "does not pass the check" $ \path ->
       property $ \b s ->
         not (B.null b) ==> do
-          let headerLength = 30 + (B.length . T.encodeUtf8 . getEntryName $ s)
+          let headerLength = 50 + (B.length . T.encodeUtf8 . getEntryName $ s)
           localFileHeaderOffset <- createArchive path $ do
             addEntry Store b s
             commit
diff --git a/zip.cabal b/zip.cabal
--- a/zip.cabal
+++ b/zip.cabal
@@ -1,11 +1,11 @@
 cabal-version:   2.4
 name:            zip
-version:         2.0.0
+version:         2.0.1
 license:         BSD-3-Clause
 license-file:    LICENSE.md
 maintainer:      Mark Karpov <markkarpov92@gmail.com>
 author:          Mark Karpov <markkarpov92@gmail.com>
-tested-with:     ghc ==9.0.1 ghc ==9.2.5 ghc ==9.4.4
+tested-with:     ghc ==9.4.7 ghc ==9.6.3 ghc ==9.8.1
 homepage:        https://github.com/mrkkrp/zip
 bug-reports:     https://github.com/mrkkrp/zip/issues
 synopsis:        Operations on zip archives
@@ -49,10 +49,10 @@
         Codec.Archive.Zip.Internal
         Codec.Archive.Zip.Type
 
-    default-language: Haskell2010
+    default-language: GHC2021
     build-depends:
-        base >=4.15 && <5.0,
-        bytestring >=0.9 && <0.12,
+        base >=4.15 && <5,
+        bytestring >=0.9 && <0.13,
         case-insensitive >=1.2.0.2 && <1.3,
         cereal >=0.3 && <0.6,
         conduit >=1.3 && <1.4,
@@ -64,11 +64,11 @@
         exceptions >=0.6 && <0.11,
         filepath >=1.2 && <1.5,
         monad-control >=1.0 && <1.1,
-        mtl >=2.0 && <3.0,
+        mtl >=2 && <3,
         resourcet >=1.2 && <1.4,
-        text >=0.2 && <2.1,
+        text >=0.2 && <2.2,
         time >=1.4 && <1.13,
-        transformers >=0.4 && <0.6,
+        transformers >=0.4 && <0.7,
         transformers-base
 
     if !flag(disable-bzip2)
@@ -80,8 +80,8 @@
     if flag(dev)
         cpp-options: -DHASKELL_ZIP_DEV_MODE
         ghc-options:
-            -O0 -Wall -Werror -Wcompat -Wincomplete-record-updates
-            -Wincomplete-uni-patterns -Wnoncanonical-monad-instances
+            -Wall -Werror -Wredundant-constraints -Wpartial-fields
+            -Wunused-packages
 
     else
         ghc-options: -O2 -Wall
@@ -102,16 +102,16 @@
 executable haskell-zip-app
     main-is:          Main.hs
     hs-source-dirs:   bench-app
-    default-language: Haskell2010
+    default-language: GHC2021
     build-depends:
-        base >=4.15 && <5.0,
+        base >=4.15 && <5,
         filepath >=1.2 && <1.5,
         zip
 
     if flag(dev)
         ghc-options:
-            -Wall -Werror -Wcompat -Wincomplete-record-updates
-            -Wincomplete-uni-patterns -Wnoncanonical-monad-instances
+            -Wall -Werror -Wredundant-constraints -Wpartial-fields
+            -Wunused-packages
 
     else
         ghc-options: -O2 -Wall
@@ -120,26 +120,26 @@
     type:             exitcode-stdio-1.0
     main-is:          Main.hs
     hs-source-dirs:   tests
-    default-language: Haskell2010
+    default-language: GHC2021
     build-depends:
-        base >=4.15 && <5.0,
-        QuickCheck >=2.4 && <3.0,
-        bytestring >=0.9 && <0.12,
+        base >=4.15 && <5,
+        QuickCheck >=2.4 && <3,
+        bytestring >=0.9 && <0.13,
         conduit >=1.3 && <1.4,
         containers >=0.5 && <0.7,
         directory >=1.2.2 && <1.4,
-        dlist >=0.8 && <2.0,
-        exceptions >=0.6 && <0.11,
+        dlist >=0.8 && <2,
         filepath >=1.2 && <1.5,
-        hspec >=2.0 && <3.0,
+        hspec >=2 && <3,
         temporary >=1.1 && <1.4,
-        text >=0.2 && <2.1,
+        text >=0.2 && <2.2,
         time >=1.4 && <1.13,
-        transformers >=0.4 && <0.6,
         zip
 
     if flag(dev)
-        ghc-options: -O0 -Wall -Werror
+        ghc-options:
+            -Wall -Werror -Wredundant-constraints -Wpartial-fields
+            -Wunused-packages
 
     else
         ghc-options: -O2 -Wall
