diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 0fe8e1f..82a6d33 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -2,6 +2,18 @@
 Changelog for package genpy
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
+0.6.16 (2021-05-01)
+-------------------
+* Fix runtime incompatibility with messages generated with 0.6.14 (`#139 <https://github.com/ros/genpy/issues/139>`_)
+* Contributors: Shane Loretz
+
+0.6.15 (2021-04-12)
+-------------------
+* Update maintainers (`#135 <https://github.com/ros/genpy/issues/135>`_)
+* Check for Python 3 before looking up codec (`#134 <https://github.com/ros/genpy/issues/134>`_)
+* Add check for float32 and float64 to check_type (`#131 <https://github.com/ros/genpy/issues/131>`_)
+* Contributors: Dirk Thomas, Martin G√ľnther, Shane Loretz
+
 0.6.14 (2020-08-10)
 -------------------
 * create Struct objects to save memory (`#129 <https://github.com/ros/genpy/issues/129>`_)
diff --git a/debian/changelog b/debian/changelog
index 1546c7b..e904fc7 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+ros-genpy (0.6.16-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Sat, 05 Jun 2021 03:23:55 -0000
+
 ros-genpy (0.6.14-2) unstable; urgency=medium
 
   * simplify packaging
diff --git a/debian/patches/0001-Fix-location-of-genmsg_py.py.patch b/debian/patches/0001-Fix-location-of-genmsg_py.py.patch
index 901433f..c7a4fde 100644
--- a/debian/patches/0001-Fix-location-of-genmsg_py.py.patch
+++ b/debian/patches/0001-Fix-location-of-genmsg_py.py.patch
@@ -6,10 +6,10 @@ Subject: Fix location of genmsg_py.py
  cmake/genpy-extras.cmake.em | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
-diff --git a/cmake/genpy-extras.cmake.em b/cmake/genpy-extras.cmake.em
-index 16b9660..7f4ab47 100644
---- a/cmake/genpy-extras.cmake.em
-+++ b/cmake/genpy-extras.cmake.em
+Index: ros-genpy/cmake/genpy-extras.cmake.em
+===================================================================
+--- ros-genpy.orig/cmake/genpy-extras.cmake.em
++++ ros-genpy/cmake/genpy-extras.cmake.em
 @@ -3,7 +3,7 @@
  set(GENPY_BIN_DIR "@(CMAKE_CURRENT_SOURCE_DIR)/scripts")
  @[else]@
diff --git a/package.xml b/package.xml
index 71292b3..4f28dce 100644
--- a/package.xml
+++ b/package.xml
@@ -4,9 +4,10 @@
   schematypens="http://www.w3.org/2001/XMLSchema"?>
 <package format="3">
   <name>genpy</name>
-  <version>0.6.14</version>
+  <version>0.6.16</version>
   <description>Python ROS message and service generators.</description>
-  <maintainer email="dthomas@osrfoundation.org">Dirk Thomas</maintainer>
+  <maintainer email="mabel@openrobotics.org">Mabel Zhang</maintainer>
+  <maintainer email="sloretz@openrobotics.org">Shane Loretz</maintainer>
   <license>BSD</license>
 
   <url type="website">http://wiki.ros.org/genpy</url>
@@ -27,6 +28,9 @@
   <exec_depend condition="$ROS_PYTHON_VERSION == 2">python-yaml</exec_depend>
   <exec_depend condition="$ROS_PYTHON_VERSION == 3">python3-yaml</exec_depend>
 
+  <test_depend condition="$ROS_PYTHON_VERSION == 2">python-numpy</test_depend>
+  <test_depend condition="$ROS_PYTHON_VERSION == 3">python3-numpy</test_depend>
+
   <export>
     <message_generator>py</message_generator>
     <rosdoc config="rosdoc.yaml"/>
diff --git a/src/genpy/generator.py b/src/genpy/generator.py
index 6c58045..5c3ad50 100644
--- a/src/genpy/generator.py
+++ b/src/genpy/generator.py
@@ -758,7 +758,8 @@ def deserialize_fn_generator(msg_context, spec, is_numpy=False):  # noqa: D401
     :param is_numpy: if True, generate serializer code for numpy
       datatypes instead of Python lists, ``bool``
     """
-    yield 'codecs.lookup_error("rosmsg").msg_type = self._type'
+    yield 'if python3:'
+    yield INDENT+'codecs.lookup_error("rosmsg").msg_type = self._type'
     yield 'try:'
     package = spec.package
     # Instantiate embedded type classes
diff --git a/src/genpy/message.py b/src/genpy/message.py
index 9318654..01af6e7 100644
--- a/src/genpy/message.py
+++ b/src/genpy/message.py
@@ -57,13 +57,19 @@ try:
 except NameError:  # Python 3
     from importlib import reload
 
-# common struct pattern singletons for msgs to use. Although this
-# would better placed in a generator-specific module, we don't want to
-# add another import to messages (which incurs higher import cost)
-
 if sys.version > '3':
     long = int
 
+try:
+    import numpy as np
+    _valid_float_types = [float, int, long, np.float32, np.float64, np.int8, np.int16, np.int32, np.int64, np.uint8,
+                          np.uint16, np.uint32, np.uint64]
+except ImportError:
+    _valid_float_types = [float, int, long]
+
+# common struct pattern singletons for msgs to use. Although this
+# would better placed in a generator-specific module, we don't want to
+# add another import to messages (which incurs higher import cost)
 struct_I = struct.Struct('<I')
 
 _warned_decoding_error = set()
@@ -261,6 +267,9 @@ def check_type(field_name, field_type, field_val):
             maxval = int(math.pow(2, _widths[field_type]))
             if field_val >= maxval:
                 raise SerializationError('field %s exceeds specified width [%s]' % (field_name, field_type))
+        elif field_type in ['float32', 'float64']:
+            if type(field_val) not in _valid_float_types:
+                raise SerializationError('field %s must be float type' % field_name)
         elif field_type == 'bool':
             if field_val not in [True, False, 0, 1]:
                 raise SerializationError('field %s is not a bool' % (field_name))
diff --git a/test/test_genpy_message.py b/test/test_genpy_message.py
index a4dfcdd..e890229 100644
--- a/test/test_genpy_message.py
+++ b/test/test_genpy_message.py
@@ -364,6 +364,7 @@ class MessageTest(unittest.TestCase):
 
         check_type will throw an exception when it fails
         """
+        import numpy as np
         genpy.message.check_type('test', 'uint8[]', 'byteDataIsAStringInPy')
         genpy.message.check_type('test', 'char[]', 'byteDataIsAStringInPy')
         genpy.message.check_type('test', 'uint8[]', [3, 4, 5])
@@ -385,6 +386,21 @@ class MessageTest(unittest.TestCase):
         genpy.message.check_type('test', 'string', 'IAmAString')
         genpy.message.check_type('test', 'time', Time())
         genpy.message.check_type('test', 'duration', Duration(5))
+        genpy.message.check_type('test', 'float32', 5)
+        genpy.message.check_type('test', 'float32', 5.0)
+        genpy.message.check_type('test', 'float32', np.int16(5))
+        genpy.message.check_type('test', 'float32', np.float32(5.0))
+        genpy.message.check_type('test', 'float32', float('inf'))
+        genpy.message.check_type('test', 'float32', -float('inf'))
+        genpy.message.check_type('test', 'float32', float('nan'))
+        genpy.message.check_type('test', 'float32', -float('nan'))
+        genpy.message.check_type('test', 'float32', 2147483647)   # resulting float: 2147483648.0
+        genpy.message.check_type('test', 'float64', 5.0)
+        genpy.message.check_type('test', 'float64', 1 + np.finfo(np.float64).eps)
+        genpy.message.check_type('test', 'float64', np.float64(5.0))
+        genpy.message.check_type('test', 'float64', np.int32(2147483647))
+        # smallest representable float larger than 1.0 in builtin float type (64 bits). conversion to float32 loses precision.
+        genpy.message.check_type('test', 'float32', float(1 + 2**-52))
 
     def test_check_types_invalid(self):
         from genpy import SerializationError
@@ -404,6 +420,8 @@ class MessageTest(unittest.TestCase):
                           'test', 'bool', -2)
         self.assertRaises(SerializationError, genpy.message.check_type,
                           'test', 'bool', 2)
+        self.assertRaises(SerializationError, genpy.message.check_type,
+                          'test', 'float64', 'someString')
         try:
             u = unichr(1234)
         except NameError:
@@ -735,7 +753,7 @@ foo " bar
             m.serialize(buff)
             assert False, 'This should have raised a genpy.SerializationError'
         except genpy.SerializationError as e:
-            self.assertEqual(str(e), "<class 'struct.error'>: 'required argument is not a float' when writing '1.0'")
+            self.assertEqual(str(e), "field float must be float type")
         except Exception:
             assert False, 'This should have raised a genpy.SerializationError instead'