diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
 # Revision history for http-interchange
 
+## 0.3.1.0 -- 2023-08-16
+
+* Add these to `Http.Headers`: cons, snoc, lookupHost, lookupAccept,
+  lookupDate, lacksContentLengthAndTransferEncoding,
+  snocContentLength.
+
 ## 0.3.0.0 -- 2023-08-15
 
 * Add `Http.Headers.fromList`. In examples, this makes it easier
diff --git a/http-interchange.cabal b/http-interchange.cabal
--- a/http-interchange.cabal
+++ b/http-interchange.cabal
@@ -1,6 +1,6 @@
 cabal-version: 3.0
 name: http-interchange
-version: 0.3.0.0
+version: 0.3.1.0
 license: BSD-3-Clause
 license-file: LICENSE
 author: Andrew Martin
@@ -31,7 +31,7 @@
     , primitive >=0.7.4
     , text >=2.0
     , bytebuild >=0.3.10
-    , contiguous >=0.6.4
+    , contiguous >=0.6.3
   hs-source-dirs: src
   default-language: GHC2021
 
diff --git a/src/Http/Headers.hs b/src/Http/Headers.hs
--- a/src/Http/Headers.hs
+++ b/src/Http/Headers.hs
@@ -13,6 +13,9 @@
     -- * Construct
   , fromArray
   , fromList
+    -- * Modify
+  , cons
+  , snoc
     -- * Expose
   , toArray
     -- * Lookup
@@ -23,20 +26,29 @@
   , lookupContentType
   , lookupContentLength
   , lookupTransferEncoding
+  , lookupHost
+  , lookupAccept
+  , lookupDate
+    -- * Specialized Snoc
+  , snocContentLength
+    -- * Specialized Absence
+  , lacksContentLengthAndTransferEncoding
   ) where
 
 import Prelude hiding (lookup)
 
-import Data.Text (Text)
+import Data.Foldable (foldl')
+import Data.Maybe (isNothing)
 import Data.Primitive (SmallArray)
+import Data.Text (Text)
 import Http.Header (Header(Header))
-import Data.Foldable (foldl')
 
 import qualified Data.List as List
+import qualified Data.Primitive as PM
 import qualified Data.Primitive.Contiguous as C
 import qualified Data.Text as T
-import qualified Http.Header
 import qualified GHC.Exts as Exts
+import qualified Http.Header
 
 -- | Collection of HTTP headers. Supports case-insensitive lookup.
 -- This is intended to be used for small collections of headers.
@@ -46,7 +58,7 @@
 -- This preserves the original order of the headers and the original
 -- case of the header names.
 newtype Headers = Headers (SmallArray Header)
-  deriving newtype (Show)
+  deriving newtype (Show,Semigroup,Monoid)
 
 -- | Many headers cannot appear more than once. This is part of
 -- the return type for 'lookup', and it helps us track whether the
@@ -62,6 +74,14 @@
 fromArray :: SmallArray Header -> Headers
 fromArray = Headers
 
+-- | Add a header to the beginning of the headers.
+cons :: Header -> Headers -> Headers
+cons hdr (Headers hdrs) = Headers (C.insertAt hdrs 0 hdr)
+
+-- | Add a header to the beginning of the headers.
+snoc :: Headers -> Header -> Headers
+snoc (Headers hdrs) hdr = Headers (C.insertAt hdrs (PM.sizeofSmallArray hdrs) hdr)
+
 -- | Convert list of headers to a 'Headers' collection that supports
 -- efficient lookup.
 fromList :: [Header] -> Headers
@@ -123,3 +143,23 @@
 
 lookupContentLength :: Headers -> Either LookupException Header
 lookupContentLength = lookup "content-length"
+
+lookupHost :: Headers -> Either LookupException Header
+lookupHost = lookup "host"
+
+lookupAccept :: Headers -> Either LookupException Header
+lookupAccept = lookup "accept"
+
+lookupDate :: Headers -> Either LookupException Header
+lookupDate = lookup "date"
+
+snocContentLength :: Headers -> Text -> Headers
+snocContentLength hdrs val = snoc hdrs (Header "Content-Length" val)
+
+-- | Returns @True@ if both the @Content-Length@ and @Transfer-Encoding@
+-- headers are missing.
+lacksContentLengthAndTransferEncoding :: Headers -> Bool
+lacksContentLengthAndTransferEncoding hdrs =
+  isNothing (lookupFirst "content-length" hdrs)
+  &&
+  isNothing (lookupFirst "transfer-encoding" hdrs)
