diff --git a/twisted/web/http_headers.py b/twisted/web/http_headers.py
index f0790b9..4652af8 100644
--- a/twisted/web/http_headers.py
+++ b/twisted/web/http_headers.py
@@ -194,9 +194,18 @@ class Headers(object):
 
         @return: C{None}
         """
+
+        if not all(isinstance(n, bytes) for n in name):
+            raise TypeError("Header name %r must consist of bytes" % name)
+
         if not isinstance(values, list):
             raise TypeError("Header entry %r should be list but found "
                             "instance of %r instead" % (name, type(values)))
+
+        for val in values:
+            if not all(isinstance(n, bytes) for n in val):
+                raise TypeError("Header entry %r must consist of bytes" % val)
+
         self._rawHeaders[name.lower()] = values
 
 
diff --git a/twisted/web/test/test_http.py b/twisted/web/test/test_http.py
index f3f2dcc..21c3329 100644
--- a/twisted/web/test/test_http.py
+++ b/twisted/web/test/test_http.py
@@ -306,7 +306,7 @@ class PersistenceTestCase(unittest.TestCase):
     ptests = [
         # (_prequest(connection=[b"Keep-Alive"]), b"HTTP/1.0", 1, {b'connection' : [b'Keep-Alive']}),
         (_prequest(), b"HTTP/1.0", 0, {b'connection': None}),
-        (_prequest(connection=[b"close"]), b"HTTP/1.1", 0,
+        (_prequest(connection = [b"close"]), b"HTTP/1.1", 0,
          {b'connection' : [b'close']}),
         (_prequest(), b"HTTP/1.1", 1, {b'connection': None}),
         (_prequest(), b"HTTP/0.9", 0, {b'connection': None}),
@@ -631,7 +631,7 @@ class ParsingTestCase(unittest.TestCase):
         self.didRequest = False
 
 
-    def runRequest(self, httpRequest, requestClass, success=1):
+    def runRequest(self, httpRequest, requestClass, success = 1):
         httpRequest = httpRequest.replace(b"\n", b"\r\n")
         b = StringTransport()
         a = http.HTTPChannel()
@@ -903,7 +903,7 @@ Content-Transfer-Encoding: quoted-printable
 abasdfg
 --AaB03x--
 '''
-        self.runRequest(req, http.Request, success=False)
+        self.runRequest(req, http.Request, success = False)
     if _PY3:
         testMissingContentDisposition.skip = (
             "Cannot parse multipart/form-data on Python 3.  "
@@ -982,7 +982,7 @@ Hello,
                 # This request should fail, so this should never be called.
                 didRequest.append(True)
 
-        channel = self.runRequest(httpRequest, MyRequest, success=False)
+        channel = self.runRequest(httpRequest, MyRequest, success = False)
         self.assertFalse(didRequest, "Request.process called")
         self.assertEqual(
             channel.transport.value(),
@@ -997,10 +997,10 @@ class QueryArgumentsTestCase(unittest.TestCase):
             cgi.parse_qs(b"a=b&d=c;+=f"),
             http.parse_qs(b"a=b&d=c;+=f"))
         self.assertRaises(
-            ValueError, http.parse_qs, b"blah", strict_parsing=True)
+            ValueError, http.parse_qs, b"blah", strict_parsing = True)
         self.assertEqual(
-            cgi.parse_qs(b"a=&b=c", keep_blank_values=1),
-            http.parse_qs(b"a=&b=c", keep_blank_values=1))
+            cgi.parse_qs(b"a=&b=c", keep_blank_values = 1),
+            http.parse_qs(b"a=&b=c", keep_blank_values = 1))
         self.assertEqual(
             cgi.parse_qs(b"a=&b=c"),
             http.parse_qs(b"a=&b=c"))
@@ -1357,7 +1357,7 @@ class RequestTests(unittest.TestCase, ResponseTestMixin):
 
         req.setResponseCode(200)
         req.clientproto = b"HTTP/1.0"
-        req.responseHeaders.setRawHeaders(b"test", [10])
+        req.responseHeaders.setRawHeaders(b"test", ["10"])
         req.write(b'Hello')
 
         self.assertResponseEquals(
@@ -1367,14 +1367,19 @@ class RequestTests(unittest.TestCase, ResponseTestMixin):
               b"Hello")])
 
         warnings = self.flushWarnings(
-            offendingFunctions=[self.test_nonByteHeaderValue])
-        self.assertEqual(1, len(warnings))
-        self.assertEqual(warnings[0]['category'], DeprecationWarning)
-        self.assertEqual(
-            warnings[0]['message'],
-            "Passing non-bytes header values is deprecated since "
-            "Twisted 12.3. Pass only bytes instead.")
+            offendingFunctions = [self.test_nonByteHeaderValue])
+        self.assertEqual(0, len(warnings))
+
+    def test_nonByteHeaderError(self):
+        """
+        L{http.Request.write} casts non-bytes header value to bytes
+        transparently.
+        """
+        req = http.Request(DummyChannel(), None)
 
+        intlist = [int(1), int(2)]
+        err = self.assertRaises(TypeError, req.responseHeaders.setRawHeaders, intlist, ["10"])
+        self.assertEqual(str(err), "Header name " + intlist.__str__() + " must consist of bytes")
 
     def test_firstWriteHTTP11Chunked(self):
         """
