diff --git a/src/ref.hpp b/src/ref.hpp
index ddeee580bd5eca338beb9797604f5e67cf86e442..641228e1862ac20c3bec6225fe0b2169f7db6df8 100644
--- a/src/ref.hpp
+++ b/src/ref.hpp
@@ -19,6 +19,12 @@
 
 #include "eigenpy/fwd.hpp"
 
+// For old Eigen versions, EIGEN_DEVICE_FUNC is not defined.
+// We must define it just in the scope of this file.
+#if not EIGEN_VERSION_AT_LEAST(3,2,91)
+#define EIGEN_DEVICE_FUNC
+#endif
+
 namespace eigenpy
 {
   template<typename MatType, int IsVectorAtCompileTime = MatType::IsVectorAtCompileTime>
@@ -49,17 +55,21 @@ namespace eigenpy
     
     typedef typename Eigen::internal::traits<Base>::Scalar Scalar; /*!< \brief Numeric type, e.g. float, double, int or std::complex<float>. */ \
     typedef typename Eigen::NumTraits<Scalar>::Real RealScalar; /*!< \brief The underlying numeric type for composed scalar types. \details In cases where Scalar is e.g. std::complex<T>, T were corresponding to RealScalar. */ \
-    typedef typename Base::CoeffReturnType CoeffReturnType; /*!< \brief The return type for coefficient access. \details Depending on whether the object allows direct coefficient access (e.g. for a MatrixXd), this type is either 'const Scalar&' or simply 'Scalar' for objects that do not allow direct coefficient access. */ \
-    typedef typename Eigen::internal::ref_selector<Base>::type Nested; \
-    typedef typename Eigen::internal::traits<Base>::StorageKind StorageKind; \
-    typedef typename Eigen::internal::traits<Base>::StorageIndex StorageIndex; \
-    enum { RowsAtCompileTime = Eigen::internal::traits<Base>::RowsAtCompileTime, \
-      ColsAtCompileTime = Eigen::internal::traits<Base>::ColsAtCompileTime, \
-      Flags = Eigen::internal::traits<Base>::Flags, \
-      SizeAtCompileTime = Base::SizeAtCompileTime, \
-      MaxSizeAtCompileTime = Base::MaxSizeAtCompileTime, \
-      IsVectorAtCompileTime = Base::IsVectorAtCompileTime }; \
-    using Base::derived; \
+    typedef typename Base::CoeffReturnType CoeffReturnType; /*!< \brief The return type for coefficient access. \details Depending on whether the object allows direct coefficient access (e.g. for a MatrixXd), this type is either 'const Scalar&' or simply 'Scalar' for objects that do not allow direct coefficient access. */
+    typedef typename Eigen::internal::ref_selector<Base>::type Nested;
+    typedef typename Eigen::internal::traits<Base>::StorageKind StorageKind;
+#if EIGEN_VERSION_AT_LEAST(3,2,91)
+    typedef typename Eigen::internal::traits<Base>::StorageIndex StorageIndex;
+#else
+    typedef typename Eigen::internal::traits<Base>::Index StorageIndex;
+#endif
+    enum { RowsAtCompileTime = Eigen::internal::traits<Base>::RowsAtCompileTime,
+      ColsAtCompileTime = Eigen::internal::traits<Base>::ColsAtCompileTime,
+      Flags = Eigen::internal::traits<Base>::Flags,
+      SizeAtCompileTime = Base::SizeAtCompileTime,
+      MaxSizeAtCompileTime = Base::MaxSizeAtCompileTime,
+      IsVectorAtCompileTime = Base::IsVectorAtCompileTime };
+    using Base::derived;
     using Base::const_cast_derived;
     typedef typename Base::PacketScalar PacketScalar;
     
@@ -94,4 +104,8 @@ namespace eigenpy
   }; // struct Ref<PlainObjectType>
 }
 
+#if not EIGEN_VERSION_AT_LEAST(3,2,91)
+#undef EIGEN_DEVICE_FUNC
+#endif
+
 #endif // ifndef __eigenpy_ref_hpp__