diff --git a/include/eigenpy/details/rvalue_from_python_data.hpp b/include/eigenpy/details/rvalue_from_python_data.hpp
index 3cd94e979cc59f40f30d6f01131d144f07829136..254961b9fb3a2a69848e9364ba8e3c16f195c735 100644
--- a/include/eigenpy/details/rvalue_from_python_data.hpp
+++ b/include/eigenpy/details/rvalue_from_python_data.hpp
@@ -1,3 +1,7 @@
+/*
+ * Copyright 2018-2020, INRIA
+ */
+
 #ifndef __eigenpy_details_rvalue_from_python_data_hpp__
 #define __eigenpy_details_rvalue_from_python_data_hpp__
 
@@ -10,14 +14,51 @@ namespace boost
   {
     namespace converter
     {
-  
+
       /// \brief Template specialization of rvalue_from_python_data
       template<typename Derived>
       struct rvalue_from_python_data<Eigen::MatrixBase<Derived> const & >
-      : rvalue_from_python_storage<Eigen::MatrixBase<Derived> const & >
+      : rvalue_from_python_storage<Derived const & >
+      {
+        typedef Eigen::MatrixBase<Derived> const & T;
+
+# if (!defined(__MWERKS__) || __MWERKS__ >= 0x3000) \
+&& (!defined(__EDG_VERSION__) || __EDG_VERSION__ >= 245) \
+&& (!defined(__DECCXX_VER) || __DECCXX_VER > 60590014) \
+&& !defined(BOOST_PYTHON_SYNOPSIS) /* Synopsis' OpenCXX has trouble parsing this */
+        // This must always be a POD struct with m_data its first member.
+        BOOST_STATIC_ASSERT(BOOST_PYTHON_OFFSETOF(rvalue_from_python_storage<T>,stage1) == 0);
+# endif
+
+        // The usual constructor
+        rvalue_from_python_data(rvalue_from_python_stage1_data const & _stage1)
+        {
+          this->stage1 = _stage1;
+        }
+
+        // This constructor just sets m_convertible -- used by
+        // implicitly_convertible<> to perform the final step of the
+        // conversion, where the construct() function is already known.
+        rvalue_from_python_data(void* convertible)
+        {
+          this->stage1.convertible = convertible;
+        }
+
+        // Destroys any object constructed in the storage.
+        ~rvalue_from_python_data()
+        {
+          if (this->stage1.convertible == this->storage.bytes)
+            static_cast<Derived *>((void *)this->storage.bytes)->~Derived();
+        }
+      };
+
+      /// \brief Template specialization of rvalue_from_python_data
+      template<typename Derived>
+      struct rvalue_from_python_data<Eigen::EigenBase<Derived> const & >
+      : rvalue_from_python_storage<Derived const & >
       {
         typedef Eigen::MatrixBase<Derived> const & T;
-        
+
 # if (!defined(__MWERKS__) || __MWERKS__ >= 0x3000) \
 && (!defined(__EDG_VERSION__) || __EDG_VERSION__ >= 245) \
 && (!defined(__DECCXX_VER) || __DECCXX_VER > 60590014) \
@@ -25,13 +66,13 @@ namespace boost
         // This must always be a POD struct with m_data its first member.
         BOOST_STATIC_ASSERT(BOOST_PYTHON_OFFSETOF(rvalue_from_python_storage<T>,stage1) == 0);
 # endif
-        
+
         // The usual constructor
         rvalue_from_python_data(rvalue_from_python_stage1_data const & _stage1)
         {
           this->stage1 = _stage1;
         }
-        
+
         // This constructor just sets m_convertible -- used by
         // implicitly_convertible<> to perform the final step of the
         // conversion, where the construct() function is already known.
@@ -39,7 +80,7 @@ namespace boost
         {
           this->stage1.convertible = convertible;
         }
-        
+
         // Destroys any object constructed in the storage.
         ~rvalue_from_python_data()
         {
@@ -47,7 +88,7 @@ namespace boost
             static_cast<Derived *>((void *)this->storage.bytes)->~Derived();
         }
       };
-      
+
     }
   }
 } // namespace boost::python::converter