diff --git a/slang_rs_export_type.cpp b/slang_rs_export_type.cpp
index e0f678c..9324c3d 100644
--- a/slang_rs_export_type.cpp
+++ b/slang_rs_export_type.cpp
@@ -391,8 +391,11 @@
         ET->getLLVMType());
 }
 
-RSExportType::RSExportType(RSContext *Context, const llvm::StringRef &Name)
+RSExportType::RSExportType(RSContext *Context,
+                           ExportClass Class,
+                           const llvm::StringRef &Name)
     : mContext(Context),
+      mClass(Class),
       // Make a copy on Name since memory stored @Name is either allocated in
       // ASTContext or allocated in GetTypeName which will be destroyed later.
       mName(Name.data(), Name.size()),
@@ -551,7 +554,8 @@
   if ((DT == DataTypeUnknown) || TypeName.empty())
     return NULL;
   else
-    return new RSExportPrimitiveType(Context, TypeName, DT, DK, Normalized);
+    return new RSExportPrimitiveType(Context, ExportClassPrimitive, TypeName,
+                                     DT, DK, Normalized);
 }
 
 RSExportPrimitiveType *RSExportPrimitiveType::Create(RSContext *Context,
@@ -564,10 +568,6 @@
     return NULL;
 }
 
-RSExportType::ExportClass RSExportPrimitiveType::getClass() const {
-  return RSExportType::ExportClassPrimitive;
-}
-
 const llvm::Type *RSExportPrimitiveType::convertToLLVMType() const {
   llvm::LLVMContext &C = getRSContext()->getLLVMContext();
 
@@ -659,10 +659,6 @@
   return new RSExportPointerType(Context, TypeName, PointeeET);
 }
 
-RSExportType::ExportClass RSExportPointerType::getClass() const {
-  return RSExportType::ExportClassPointer;
-}
-
 const llvm::Type *RSExportPointerType::convertToLLVMType() const {
   const llvm::Type *PointeeType = mPointeeType->getLLVMType();
   return llvm::PointerType::getUnqual(PointeeType);
@@ -757,10 +753,6 @@
   return NULL;
 }
 
-RSExportType::ExportClass RSExportVectorType::getClass() const {
-  return RSExportType::ExportClassVector;
-}
-
 const llvm::Type *RSExportVectorType::convertToLLVMType() const {
   const llvm::Type *ElementType = RSExportPrimitiveType::convertToLLVMType();
   return llvm::VectorType::get(ElementType, getNumElement());
@@ -825,10 +817,6 @@
   return new RSExportMatrixType(Context, TypeName, Dim);
 }
 
-RSExportType::ExportClass RSExportMatrixType::getClass() const {
-  return RSExportType::ExportClassMatrix;
-}
-
 const llvm::Type *RSExportMatrixType::convertToLLVMType() const {
   // Construct LLVM type:
   // struct {
@@ -866,10 +854,6 @@
                                        Size);
 }
 
-RSExportType::ExportClass RSExportConstantArrayType::getClass() const {
-  return RSExportType::ExportClassConstantArray;
-}
-
 const llvm::Type *RSExportConstantArrayType::convertToLLVMType() const {
   return llvm::ArrayType::get(mElementType->getLLVMType(), getSize());
 }
@@ -945,10 +929,6 @@
   return ERT;
 }
 
-RSExportType::ExportClass RSExportRecordType::getClass() const {
-  return RSExportType::ExportClassRecord;
-}
-
 const llvm::Type *RSExportRecordType::convertToLLVMType() const {
   std::vector<const llvm::Type*> FieldTypes;
 
diff --git a/slang_rs_export_type.h b/slang_rs_export_type.h
index 1d583d9..8c56559 100644
--- a/slang_rs_export_type.h
+++ b/slang_rs_export_type.h
@@ -52,13 +52,16 @@
 
  private:
   RSContext *mContext;
+  ExportClass mClass;
   std::string mName;
 
   // Cache the result after calling convertToLLVMType() at the first time
   mutable const llvm::Type *mLLVMType;
 
  protected:
-  RSExportType(RSContext *Context, const llvm::StringRef &Name);
+  RSExportType(RSContext *Context,
+               ExportClass Class,
+               const llvm::StringRef &Name);
 
   // Let's make it private since there're some prerequisites to call this
   // function.
@@ -99,7 +102,7 @@
 
   static const clang::Type *GetTypeOfDecl(const clang::DeclaratorDecl *DD);
 
-  virtual ExportClass getClass() const = 0;
+  inline ExportClass getClass() const { return mClass; }
 
   inline const llvm::Type *getLLVMType() const {
     if (mLLVMType == NULL)
@@ -208,11 +211,13 @@
   static DataType GetDataType(const clang::Type *T);
 
   RSExportPrimitiveType(RSContext *Context,
+                        // for derived class to set their type class
+                        ExportClass Class,
                         const llvm::StringRef &Name,
                         DataType DT,
                         DataKind DK,
                         bool Normalized)
-      : RSExportType(Context, Name),
+      : RSExportType(Context, Class, Name),
         mType(DT),
         mKind(DK),
         mNormalized(Normalized) {
@@ -231,8 +236,6 @@
 
   static size_t GetSizeInBits(const RSExportPrimitiveType *EPT);
 
-  virtual ExportClass getClass() const;
-
   inline DataType getType() const { return mType; }
   inline DataKind getKind() const { return mKind; }
   inline bool isRSObjectType() const {
@@ -250,7 +253,7 @@
   RSExportPointerType(RSContext *Context,
                       const llvm::StringRef &Name,
                       const RSExportType *PointeeType)
-      : RSExportType(Context, Name),
+      : RSExportType(Context, ExportClassPointer, Name),
         mPointeeType(PointeeType) {
     return;
   }
@@ -265,8 +268,6 @@
  public:
   static const clang::Type *IntegerType;
 
-  virtual ExportClass getClass() const;
-
   inline const RSExportType *getPointeeType() const { return mPointeeType; }
 };  // RSExportPointerType
 
@@ -283,7 +284,8 @@
                      DataKind DK,
                      bool Normalized,
                      unsigned NumElement)
-      : RSExportPrimitiveType(Context, Name, DT, DK, Normalized),
+      : RSExportPrimitiveType(Context, ExportClassVector, Name,
+                              DT, DK, Normalized),
         mNumElement(NumElement) {
     return;
   }
@@ -302,8 +304,6 @@
  public:
   static llvm::StringRef GetTypeName(const clang::ExtVectorType *EVT);
 
-  virtual ExportClass getClass() const;
-
   inline unsigned getNumElement() const { return mNumElement; }
 };
 
@@ -324,15 +324,13 @@
   RSExportMatrixType(RSContext *Context,
                      const llvm::StringRef &Name,
                      unsigned Dim)
-    : RSExportType(Context, Name),
+    : RSExportType(Context, ExportClassMatrix, Name),
       mDim(Dim) {
     return;
   }
 
   virtual const llvm::Type *convertToLLVMType() const;
  public:
-  virtual ExportClass getClass() const;
-
   // @RT was normalized by calling RSExportType::TypeExportable() before
   // calling this.
   static RSExportMatrixType *Create(RSContext *Context,
@@ -353,6 +351,7 @@
                             const RSExportType *ElementType,
                             unsigned Size)
     : RSExportType(Context,
+                   ExportClassConstantArray,
                    DUMMY_TYPE_NAME_FOR_RS_CONSTANT_ARRAY_TYPE),
       mElementType(ElementType),
       mSize(Size) {
@@ -366,8 +365,6 @@
 
   virtual const llvm::Type *convertToLLVMType() const;
  public:
-  virtual ExportClass getClass() const;
-
   inline unsigned getSize() const { return mSize; }
   inline const RSExportType *getElementType() const { return mElementType; }
 };
@@ -425,7 +422,7 @@
                      bool IsPacked,
                      bool IsArtificial,
                      size_t AllocSize)
-      : RSExportType(Context, Name),
+      : RSExportType(Context, ExportClassRecord, Name),
         mIsPacked(IsPacked),
         mIsArtificial(IsArtificial),
         mAllocSize(AllocSize) {
@@ -443,8 +440,6 @@
 
   virtual const llvm::Type *convertToLLVMType() const;
  public:
-  virtual ExportClass getClass() const;
-
   inline const std::list<const Field*>& getFields() const { return mFields; }
   inline bool isPacked() const { return mIsPacked; }
   inline bool isArtificial() const { return mIsArtificial; }
