diff --git a/loopy/codegen/__init__.py b/loopy/codegen/__init__.py
index 59df3af620050eef712881e955098af6678cea79..4056c0dea785a6d27225a4fd2b3337c9c9a14db9 100644
--- a/loopy/codegen/__init__.py
+++ b/loopy/codegen/__init__.py
@@ -637,6 +637,7 @@ def generate_body(kernel):
 
     seen_dtypes = set()
     seen_functions = set()
+    seen_atomic_dtypes = set()
 
     initial_implemented_domain = isl.BasicSet.from_params(kernel.assumptions)
     codegen_state = CodeGenerationState(
@@ -645,6 +646,7 @@ def generate_body(kernel):
             implemented_predicates=frozenset(),
             seen_dtypes=seen_dtypes,
             seen_functions=seen_functions,
+            seen_atomic_dtypes=seen_atomic_dtypes,
             var_subst_map={},
             allow_complex=allow_complex)
 
diff --git a/loopy/library/reduction.py b/loopy/library/reduction.py
index 90dd27133c03d6dfde5cb49707b25980d28348f1..3eb590b80e9273e70c3d71108ec130a16afee692 100644
--- a/loopy/library/reduction.py
+++ b/loopy/library/reduction.py
@@ -163,7 +163,8 @@ class _ArgExtremumReductionOperation(ReductionOperation):
             struct_dtype = np.dtype([("value", dtype), ("index", np.int32)])
             ARGEXT_STRUCT_DTYPES[dtype] = NumpyType(struct_dtype, target)
 
-            target.get_or_register_dtype(self.prefix(dtype)+"_result", struct_dtype)
+            target.get_or_register_dtype(self.prefix(dtype)+"_result",
+                    NumpyType(struct_dtype))
             return ARGEXT_STRUCT_DTYPES[dtype]
 
     def neutral_element(self, dtype, inames):
diff --git a/loopy/target/c/__init__.py b/loopy/target/c/__init__.py
index f9a5e4390d07231e3933127e262e86e58c4c5279..66210bb2ab326a48609debc0e491aeac4350ed65 100644
--- a/loopy/target/c/__init__.py
+++ b/loopy/target/c/__init__.py
@@ -178,7 +178,7 @@ class CTarget(TargetBase):
         base_storage_to_is_local = {}
         base_storage_to_align_bytes = {}
 
-        from cgen import ArrayOf, Pointer, Initializer, AlignedAttribute
+        from cgen import ArrayOf, Pointer, Initializer, AlignedAttribute, Value
         from loopy.codegen import POD  # uses the correct complex type
 
         class ConstRestrictPointer(Pointer):
@@ -251,7 +251,7 @@ class CTarget(TargetBase):
                             * product(si for si in idi.shape))
 
         for bs_name, bs_sizes in sorted(six.iteritems(base_storage_sizes)):
-            bs_var_decl = POD(self, np.int8, bs_name)
+            bs_var_decl = Value("char", bs_name)
             bs_var_decl = self.wrap_temporary_decl(
                     bs_var_decl, base_storage_to_is_local[bs_name])
             bs_var_decl = ArrayOf(bs_var_decl, max(bs_sizes))
diff --git a/loopy/target/opencl.py b/loopy/target/opencl.py
index 1e224ff1f87f37270802736fe441cfebff4c9a4a..43c4ea7dc30f139261a3c8ea46e32860c265412f 100644
--- a/loopy/target/opencl.py
+++ b/loopy/target/opencl.py
@@ -44,8 +44,8 @@ class DTypeRegistryWrapperWithAtomics(DTypeRegistryWrapper):
                 return super(self.wrapped_registry.get_or_register_dtype(
                         names, NumpyType(dtype.dtype)))
 
-        return super(self.wrapped_registry.get_or_register_dtype(
-                names, dtype))
+        return super(DTypeRegistryWrapperWithAtomics, self).get_or_register_dtype(
+                names, dtype)
 
 
 class DTypeRegistryWrapperWithCL1Atomics(DTypeRegistryWrapperWithAtomics):
diff --git a/loopy/types.py b/loopy/types.py
index 21567b9a4e7db4c34e05ecb852db4d25993a3014..d80650eb6b203c70b2abf60481ebb9e38ca99b9f 100644
--- a/loopy/types.py
+++ b/loopy/types.py
@@ -107,13 +107,13 @@ class NumpyType(LoopyType):
         if self.target is None:
             raise RuntimeError("unable to pickle dtype: target not known")
 
-        c_name = self.target.dtype_to_typename(self.dtype)
+        c_name = self.target.dtype_to_typename(NumpyType(self.dtype))
         return (self.target, c_name, self.dtype)
 
     def __setstate__(self, state):
         target, name, dtype = state
         self.target = target
-        self.dtype = self.target.get_or_register_dtype([name], dtype)
+        self.dtype = self.target.get_or_register_dtype([name], NumpyType(dtype))
 
     def with_target(self, target):
         if (self.target is not None
diff --git a/loopy/version.py b/loopy/version.py
index 2ade5ba548b79cad3103bd52f32bbc1447537486..60e310a7c70e34be42b3152d3d0e89601ef092ed 100644
--- a/loopy/version.py
+++ b/loopy/version.py
@@ -32,4 +32,4 @@ except ImportError:
 else:
     _islpy_version = islpy.version.VERSION_TEXT
 
-DATA_MODEL_VERSION = "v22-islpy%s" % _islpy_version
+DATA_MODEL_VERSION = "v23-islpy%s" % _islpy_version