diff --git a/pyasn1/codec/ber/decoder.py b/pyasn1/codec/ber/decoder.py
index 985dbe503d5f5d41f16307e0212ee0ebf946e712_cHlhc24xL2NvZGVjL2Jlci9kZWNvZGVyLnB5..8b145416449f456ca224238d2cff45cbcd495336_cHlhc24xL2NvZGVjL2Jlci9kZWNvZGVyLnB5 100644
--- a/pyasn1/codec/ber/decoder.py
+++ b/pyasn1/codec/ber/decoder.py
@@ -1899,8 +1899,9 @@
          1 2 3
     """
 
-    SINGLE_ITEM_DECODER = SingleItemDecoder()
-
-    def __init__(self, substrate, asn1Spec=None, **kwargs):
+    SINGLE_ITEM_DECODER = SingleItemDecoder
+
+    def __init__(self, substrate, asn1Spec=None, **options):
+        self._singleItemDecoder = self.SINGLE_ITEM_DECODER()
         self._substrate = asSeekableStream(substrate)
         self._asn1Spec = asn1Spec
@@ -1905,6 +1906,6 @@
         self._substrate = asSeekableStream(substrate)
         self._asn1Spec = asn1Spec
-        self._options = kwargs
+        self._options = options
 
     def __iter__(self):
         while True:
@@ -1908,7 +1909,7 @@
 
     def __iter__(self):
         while True:
-            for asn1Object in self.SINGLE_ITEM_DECODER(
+            for asn1Object in self._singleItemDecoder(
                     self._substrate, self._asn1Spec, **self._options):
                 yield asn1Object
 
@@ -1990,7 +1991,10 @@
         """
         substrate = asSeekableStream(substrate)
 
-        for asn1Object in cls.STREAMING_DECODER(substrate, asn1Spec, **kwargs):
+        streamingDecoder = cls.STREAMING_DECODER(
+            substrate, asn1Spec, **kwargs)
+
+        for asn1Object in streamingDecoder:
             if isinstance(asn1Object, SubstrateUnderrunError):
                 raise error.SubstrateUnderrunError('Short substrate on input')
 
diff --git a/pyasn1/codec/ber/encoder.py b/pyasn1/codec/ber/encoder.py
index 985dbe503d5f5d41f16307e0212ee0ebf946e712_cHlhc24xL2NvZGVjL2Jlci9lbmNvZGVyLnB5..8b145416449f456ca224238d2cff45cbcd495336_cHlhc24xL2NvZGVjL2Jlci9lbmNvZGVyLnB5 100644
--- a/pyasn1/codec/ber/encoder.py
+++ b/pyasn1/codec/ber/encoder.py
@@ -846,5 +846,5 @@
 
 
 class Encoder(object):
-    SINGLE_ITEM_ENCODER = SingleItemEncoder()
+    SINGLE_ITEM_ENCODER = SingleItemEncoder
 
@@ -850,7 +850,10 @@
 
-    @classmethod
-    def __call__(cls, pyObject, asn1Spec=None, **options):
-        return cls.SINGLE_ITEM_ENCODER(pyObject, asn1Spec=asn1Spec, **options)
+    def __init__(self, **options):
+        self._singleItemEncoder = self.SINGLE_ITEM_ENCODER()
+
+    def __call__(self, pyObject, asn1Spec=None, **options):
+        return self._singleItemEncoder(
+            pyObject, asn1Spec=asn1Spec, **options)
 
 
 #: Turns ASN.1 object into BER octet stream.
diff --git a/pyasn1/codec/cer/decoder.py b/pyasn1/codec/cer/decoder.py
index 985dbe503d5f5d41f16307e0212ee0ebf946e712_cHlhc24xL2NvZGVjL2Nlci9kZWNvZGVyLnB5..8b145416449f456ca224238d2cff45cbcd495336_cHlhc24xL2NvZGVjL2Nlci9kZWNvZGVyLnB5 100644
--- a/pyasn1/codec/cer/decoder.py
+++ b/pyasn1/codec/cer/decoder.py
@@ -80,7 +80,7 @@
 class StreamingDecoder(decoder.StreamingDecoder):
     __doc__ = decoder.StreamingDecoder.__doc__
 
-    SINGLE_ITEM_DECODER = SingleItemDecoder()
+    SINGLE_ITEM_DECODER = SingleItemDecoder
 
 
 class Decoder(decoder.Decoder):
diff --git a/pyasn1/codec/cer/encoder.py b/pyasn1/codec/cer/encoder.py
index 985dbe503d5f5d41f16307e0212ee0ebf946e712_cHlhc24xL2NvZGVjL2Nlci9lbmNvZGVyLnB5..8b145416449f456ca224238d2cff45cbcd495336_cHlhc24xL2NvZGVjL2Nlci9lbmNvZGVyLnB5 100644
--- a/pyasn1/codec/cer/encoder.py
+++ b/pyasn1/codec/cer/encoder.py
@@ -270,7 +270,7 @@
 
 
 class Encoder(encoder.Encoder):
-    SINGLE_ITEM_ENCODER = SingleItemEncoder()
+    SINGLE_ITEM_ENCODER = SingleItemEncoder
 
 
 #: Turns ASN.1 object into CER octet stream.
diff --git a/pyasn1/codec/der/decoder.py b/pyasn1/codec/der/decoder.py
index 985dbe503d5f5d41f16307e0212ee0ebf946e712_cHlhc24xL2NvZGVjL2Rlci9kZWNvZGVyLnB5..8b145416449f456ca224238d2cff45cbcd495336_cHlhc24xL2NvZGVjL2Rlci9kZWNvZGVyLnB5 100644
--- a/pyasn1/codec/der/decoder.py
+++ b/pyasn1/codec/der/decoder.py
@@ -50,7 +50,7 @@
 class StreamingDecoder(decoder.StreamingDecoder):
     __doc__ = decoder.StreamingDecoder.__doc__
 
-    SINGLE_ITEM_DECODER = SingleItemDecoder()
+    SINGLE_ITEM_DECODER = SingleItemDecoder
 
 
 class Decoder(decoder.Decoder):
diff --git a/pyasn1/codec/der/encoder.py b/pyasn1/codec/der/encoder.py
index 985dbe503d5f5d41f16307e0212ee0ebf946e712_cHlhc24xL2NvZGVjL2Rlci9lbmNvZGVyLnB5..8b145416449f456ca224238d2cff45cbcd495336_cHlhc24xL2NvZGVjL2Rlci9lbmNvZGVyLnB5 100644
--- a/pyasn1/codec/der/encoder.py
+++ b/pyasn1/codec/der/encoder.py
@@ -67,7 +67,7 @@
 
 
 class Encoder(encoder.Encoder):
-    SINGLE_ITEM_ENCODER = SingleItemEncoder()
+    SINGLE_ITEM_ENCODER = SingleItemEncoder
 
 
 #: Turns ASN.1 object into DER octet stream.
diff --git a/pyasn1/codec/native/decoder.py b/pyasn1/codec/native/decoder.py
index 985dbe503d5f5d41f16307e0212ee0ebf946e712_cHlhc24xL2NvZGVjL25hdGl2ZS9kZWNvZGVyLnB5..8b145416449f456ca224238d2cff45cbcd495336_cHlhc24xL2NvZGVjL25hdGl2ZS9kZWNvZGVyLnB5 100644
--- a/pyasn1/codec/native/decoder.py
+++ b/pyasn1/codec/native/decoder.py
@@ -181,5 +181,5 @@
 
 
 class Decoder(object):
-    SINGLE_ITEM_DECODER = SingleItemDecoder()
+    SINGLE_ITEM_DECODER = SingleItemDecoder
 
@@ -185,7 +185,9 @@
 
-    @classmethod
-    def __call__(cls, pyObject, asn1Spec=None, **kwargs):
-        return cls.SINGLE_ITEM_DECODER(pyObject, asn1Spec=asn1Spec, **kwargs)
+    def __init__(self, **options):
+        self._singleItemDecoder = self.SINGLE_ITEM_DECODER()
+
+    def __call__(self, pyObject, asn1Spec=None, **kwargs):
+        return self._singleItemDecoder(pyObject, asn1Spec=asn1Spec, **kwargs)
 
 
 #: Turns Python objects of built-in types into ASN.1 objects.
diff --git a/pyasn1/codec/native/encoder.py b/pyasn1/codec/native/encoder.py
index 985dbe503d5f5d41f16307e0212ee0ebf946e712_cHlhc24xL2NvZGVjL25hdGl2ZS9lbmNvZGVyLnB5..8b145416449f456ca224238d2cff45cbcd495336_cHlhc24xL2NvZGVjL25hdGl2ZS9lbmNvZGVyLnB5 100644
--- a/pyasn1/codec/native/encoder.py
+++ b/pyasn1/codec/native/encoder.py
@@ -225,5 +225,5 @@
 
 
 class Encoder(object):
-    SINGLE_ITEM_ENCODER = SingleItemEncoder()
+    SINGLE_ITEM_ENCODER = SingleItemEncoder
 
@@ -229,7 +229,10 @@
 
-    @classmethod
-    def __call__(cls, pyObject, asn1Spec=None, **kwargs):
-        return cls.SINGLE_ITEM_ENCODER(pyObject, asn1Spec=asn1Spec, **kwargs)
+    def __init__(self, **kwargs):
+        self._singleItemEncoder = self.SINGLE_ITEM_ENCODER()
+
+    def __call__(self, pyObject, asn1Spec=None, **options):
+        return self._singleItemEncoder(
+            pyObject, asn1Spec=asn1Spec, **options)
 
 
 #: Turns ASN.1 object into a Python built-in type object(s).
diff --git a/tests/codec/ber/test_decoder.py b/tests/codec/ber/test_decoder.py
index 985dbe503d5f5d41f16307e0212ee0ebf946e712_dGVzdHMvY29kZWMvYmVyL3Rlc3RfZGVjb2Rlci5weQ==..8b145416449f456ca224238d2cff45cbcd495336_dGVzdHMvY29kZWMvYmVyL3Rlc3RfZGVjb2Rlci5weQ== 100644
--- a/tests/codec/ber/test_decoder.py
+++ b/tests/codec/ber/test_decoder.py
@@ -1615,7 +1615,7 @@
             defaultErrorState = decoder.stDumpRawValue
 
         class StreamingDecoder(decoder.StreamingDecoder):
-            SINGLE_ITEM_DECODER = SingleItemEncoder()
+            SINGLE_ITEM_DECODER = SingleItemEncoder
 
         class OneShotDecoder(decoder.Decoder):
             STREAMING_DECODER = StreamingDecoder