diff --git a/Codec/Archive/Tar/Read.hs b/Codec/Archive/Tar/Read.hs
--- a/Codec/Archive/Tar/Read.hs
+++ b/Codec/Archive/Tar/Read.hs
@@ -130,7 +130,8 @@
                    '7'  -> NormalFile      content size
                    _    -> OtherEntryType  typecode content size,
         entryPermissions = mode,
-        entryOwnership   = Ownership uname gname uid gid,
+        entryOwnership   = Ownership (BS.Char8.unpack uname)
+                                     (BS.Char8.unpack gname) uid gid,
         entryTime        = mtime,
         entryFormat      = format
     }
diff --git a/Codec/Archive/Tar/Types.hs b/Codec/Archive/Tar/Types.hs
--- a/Codec/Archive/Tar/Types.hs
+++ b/Codec/Archive/Tar/Types.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE CPP, GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE CPP, GeneralizedNewtypeDeriving, BangPatterns #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Codec.Archive.Tar.Types
@@ -52,6 +52,7 @@
   mapEntries,
   mapEntriesNoFail,
   foldEntries,
+  foldlEntries,
   unfoldEntries,
 
 #ifdef TESTS
@@ -140,10 +141,10 @@
 
 data Ownership = Ownership {
     -- | The owner user name. Should be set to @\"\"@ if unknown.
-    ownerName :: !BS.ByteString,
+    ownerName :: String,
 
     -- | The owner group name. Should be set to @\"\"@ if unknown.
-    groupName :: !BS.ByteString,
+    groupName :: String,
 
     -- | Numeric owner user id. Should be set to @0@ if unknown.
     ownerId :: {-# UNPACK #-} !Int,
@@ -185,7 +186,7 @@
   rnf  x                     = seq x ()
 
 instance NFData Ownership where
-  rnf (Ownership _ _ _ _) = () -- fully strict by construction
+  rnf (Ownership o g _ _) = rnf o `seq` rnf g
 
 -- | @rw-r--r--@ for normal files
 ordinaryFilePermissions :: Permissions
@@ -213,7 +214,7 @@
     entryPermissions = case content of
                          Directory -> directoryPermissions
                          _         -> ordinaryFilePermissions,
-    entryOwnership   = Ownership BS.empty BS.empty 0 0,
+    entryOwnership   = Ownership "" "" 0 0,
     entryTime        = 0,
     entryFormat      = UstarFormat
   }
@@ -494,6 +495,17 @@
     fold Done        = done
     fold (Fail err)  = fail' err
 
+-- | A 'foldl'-like function on Entries. It either returns the final
+-- accumulator result, or the failure along with the intermediate accumulator
+-- value.
+--
+foldlEntries :: (a -> Entry -> a) -> a -> Entries e -> Either (e, a) a
+foldlEntries f z = go z
+  where
+    go !acc (Next e es) = go (f acc e) es
+    go !acc  Done       = Right acc
+    go !acc (Fail err)  = Left (err, acc)
+
 -- | This is like the standard 'map' function on lists, but for 'Entries'. It
 -- includes failure as a extra possible outcome of the mapping function.
 --
@@ -625,7 +637,7 @@
   arbitrary = Ownership <$> name <*> name
                         <*> idno <*> idno
     where
-      name = BS.pack <$> listOf0ToN 32 (arbitrary `suchThat` (/= 0))
+      name = listOf0ToN 32 (arbitrary `suchThat` (/= '\0'))
       idno = arbitraryOctal 7
 
   shrink (Ownership oname gname oid gid) =
@@ -658,8 +670,8 @@
         other               -> other,
 
       entryOwnership = (entryOwnership entry) {
-        groupName = BS.empty,
-        ownerName = BS.empty
+        groupName = "",
+        ownerName = ""
       },
 
       entryTarPath = let TarPath name _prefix = entryTarPath entry
diff --git a/Codec/Archive/Tar/Write.hs b/Codec/Archive/Tar/Write.hs
--- a/Codec/Archive/Tar/Write.hs
+++ b/Codec/Archive/Tar/Write.hs
@@ -66,7 +66,7 @@
   } =
 
   concat
-    [ putString  100 $ name
+    [ putBString 100 $ name
     , putOct       8 $ permissions
     , putOct       8 $ ownerId ownership
     , putOct       8 $ groupId ownership
@@ -74,27 +74,27 @@
     , putOct      12 $ modTime
     , fill         8 $ ' ' -- dummy checksum
     , putChar8       $ typeCode
-    , putString  100 $ linkTarget
+    , putBString 100 $ linkTarget
     ] ++
   case format of
   V7Format    ->
       fill 255 '\NUL'
   UstarFormat -> concat
-    [ putString    8 $ ustarMagic
+    [ putBString   8 $ ustarMagic
     , putString   32 $ ownerName ownership
     , putString   32 $ groupName ownership
     , putOct       8 $ deviceMajor
     , putOct       8 $ deviceMinor
-    , putString  155 $ prefix
+    , putBString 155 $ prefix
     , fill        12 $ '\NUL'
     ]
   GnuFormat -> concat
-    [ putString    8 $ gnuMagic
+    [ putBString   8 $ gnuMagic
     , putString   32 $ ownerName ownership
     , putString   32 $ groupName ownership
     , putGnuDev    8 $ deviceMajor
     , putGnuDev    8 $ deviceMinor
-    , putString  155 $ prefix
+    , putBString 155 $ prefix
     , fill        12 $ '\NUL'
     ]
   where
@@ -122,8 +122,11 @@
 
 type FieldWidth = Int
 
-putString :: FieldWidth -> BS.ByteString -> String
-putString n s = BS.Char8.unpack (BS.take n s) ++ fill (n - BS.length s) '\NUL'
+putBString :: FieldWidth -> BS.ByteString -> String
+putBString n s = BS.Char8.unpack (BS.take n s) ++ fill (n - BS.length s) '\NUL'
+
+putString :: FieldWidth -> String -> String
+putString n s = take n s ++ fill (n - length s) '\NUL'
 
 --TODO: check integer widths, eg for large file sizes
 putOct :: (Integral a, Show a) => FieldWidth -> a -> String
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,10 @@
+0.4.5.0 Duncan Coutts <duncan@community.haskell.org> January 2016
+
+  * Revert accidental minor API change in 0.4.x series (the type of the
+    owner and group name strings). The 0.4.3.0 and 0.4.4.0 releases
+    contained the accidental API change.
+  * Add a handy foldlEntries function
+
 0.4.4.0 Duncan Coutts <duncan@community.haskell.org> January 2016
 
   * Build and warning fixes for GHC 7.10 and 8.0
diff --git a/tar.cabal b/tar.cabal
--- a/tar.cabal
+++ b/tar.cabal
@@ -1,5 +1,5 @@
 name:            tar
-version:         0.4.4.0
+version:         0.4.5.0
 license:         BSD3
 license-file:    LICENSE
 author:          Duncan Coutts <duncan@community.haskell.org>
