diff --git a/src/hb-ot-cff-common-private.hh b/src/hb-ot-cff-common-private.hh
index a526295..e22ee87 100644
--- a/src/hb-ot-cff-common-private.hh
+++ b/src/hb-ot-cff-common-private.hh
@@ -54,7 +54,7 @@
 
 /* CFF INDEX */
 template <typename COUNT>
-struct Index
+struct CFFIndex
 {
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
@@ -73,11 +73,11 @@
   inline static unsigned int calculate_serialized_size (unsigned int offSize, unsigned int count, unsigned int dataSize)
   { return min_size + calculate_offset_array_size (offSize, count) + dataSize; }
 
-  inline bool serialize (hb_serialize_context_t *c, const Index &src)
+  inline bool serialize (hb_serialize_context_t *c, const CFFIndex &src)
   {
     TRACE_SERIALIZE (this);
     unsigned int size = src.get_size ();
-    Index *dest = c->allocate_size<Index> (size);
+    CFFIndex *dest = c->allocate_size<CFFIndex> (size);
     if (unlikely (dest == nullptr)) return_trace (false);
     memcpy (dest, &src, size);
     return_trace (true);
@@ -88,7 +88,7 @@
                          const hb_vector_t<ByteStr> &byteArray)
   {
     TRACE_SERIALIZE (this);
-    /* serialize Index header */
+    /* serialize CFFIndex header */
     if (unlikely (!c->extend_min (*this))) return_trace (false);
     this->count.set (byteArray.len);
     this->offSize.set (offSize_);
@@ -158,12 +158,12 @@
 
   inline unsigned int get_size (void) const
   {
-    if (this != &Null(Index))
+    if (this != &Null(CFFIndex))
     {
       if (count > 0)
         return min_size + offset_array_size () + (offset_at (count) - 1);
       else
-        return count.static_size;  /* empty Index contains count only */
+        return count.static_size;  /* empty CFFIndex contains count only */
     }
     else
       return 0;
@@ -191,12 +191,12 @@
 };
 
 template <typename COUNT, typename TYPE>
-struct IndexOf : Index<COUNT>
+struct IndexOf : CFFIndex<COUNT>
 {
   inline const ByteStr operator [] (unsigned int index) const
   {
-    if (likely (index < Index<COUNT>::count))
-      return ByteStr (Index<COUNT>::data_base () + Index<COUNT>::offset_at (index) - 1, Index<COUNT>::length_at (index));
+    if (likely (index < CFFIndex<COUNT>::count))
+      return ByteStr (CFFIndex<COUNT>::data_base () + CFFIndex<COUNT>::offset_at (index) - 1, CFFIndex<COUNT>::length_at (index));
     return Null(ByteStr);
   }
 
@@ -209,7 +209,7 @@
                          const PARAM2 &param2)
   {
     TRACE_SERIALIZE (this);
-    /* serialize Index header */
+    /* serialize CFFIndex header */
     if (unlikely (!c->extend_min (*this))) return_trace (false);
     this->count.set (dataArray.len);
     this->offSize.set (offSize_);
@@ -221,10 +221,10 @@
     unsigned int  i = 0;
     for (; i < dataArray.len; i++)
     {
-      Index<COUNT>::set_offset_at (i, offset);
+      CFFIndex<COUNT>::set_offset_at (i, offset);
       offset += dataSizeArray[i];
     }
-    Index<COUNT>::set_offset_at (i, offset);
+    CFFIndex<COUNT>::set_offset_at (i, offset);
 
     /* serialize data */
     for (unsigned int i = 0; i < dataArray.len; i++)
@@ -254,7 +254,7 @@
     }
     offSize_ = calcOffSize (totalDataSize);
 
-    return Index<COUNT>::calculate_serialized_size (offSize_, dataArray.len, totalDataSize);
+    return CFFIndex<COUNT>::calculate_serialized_size (offSize_, dataArray.len, totalDataSize);
   }
 };
 
@@ -407,7 +407,7 @@
         dictsSize += FontDict::calculate_serialized_size (fontDicts[i], opszr);
 
     offSize_ = calcOffSize (dictsSize + 1);
-    return Index<COUNT>::calculate_serialized_size (offSize_, fdCount, dictsSize);
+    return CFFIndex<COUNT>::calculate_serialized_size (offSize_, fdCount, dictsSize);
   }
 };
 
@@ -552,7 +552,7 @@
 };
 
 template <typename COUNT>
-struct Subrs : Index<COUNT>
+struct Subrs : CFFIndex<COUNT>
 {
   inline bool serialize (hb_serialize_context_t *c, const Subrs<COUNT> &subrs, unsigned int offSize, const hb_set_t *set, const ByteStr& nullStr = ByteStr())
   {
@@ -561,7 +561,7 @@
     {
       if (!unlikely (c->allocate_size<COUNT> (COUNT::static_size)))
         return_trace (false);
-      Index<COUNT>::count.set (0);
+      CFFIndex<COUNT>::count.set (0);
       return_trace (true);
     }
     
@@ -572,7 +572,7 @@
     for (hb_codepoint_t i = 0; i < subrs.count; i++)
       bytesArray[i] = (hb_set_has (set, i))? subrs[i]: nullStr;
 
-    bool result = Index<COUNT>::serialize (c, offSize, bytesArray);
+    bool result = CFFIndex<COUNT>::serialize (c, offSize, bytesArray);
     bytesArray.fini ();
     return_trace (result);
   }
@@ -580,7 +580,7 @@
   /* in parallel to above */
   inline unsigned int calculate_serialized_size (unsigned int &offSize /*OUT*/, const hb_set_t *set, unsigned int nullStrSize = 0) const
   {
-    unsigned int  count_ = Index<COUNT>::count;
+    unsigned int  count_ = CFFIndex<COUNT>::count;
     offSize = 0;
     if ((count_ == 0) || (hb_set_get_population (set) == 0))
       return COUNT::static_size;
@@ -594,7 +594,7 @@
         dataSize += nullStrSize;
     }
     offSize = calcOffSize(dataSize);
-    return Index<COUNT>::calculate_serialized_size (offSize, count_, dataSize);
+    return CFFIndex<COUNT>::calculate_serialized_size (offSize, count_, dataSize);
   }
 };
 
diff --git a/src/hb-ot-cff1-table.hh b/src/hb-ot-cff1-table.hh
index b794bba..f2a255c 100644
--- a/src/hb-ot-cff1-table.hh
+++ b/src/hb-ot-cff1-table.hh
@@ -38,10 +38,10 @@
  */
 #define HB_OT_TAG_cff1 HB_TAG('C','F','F',' ')
 
-typedef Index<HBUINT16>   CFF1Index;
+typedef CFFIndex<HBUINT16>  CFF1Index;
 template <typename Type> struct CFF1IndexOf : IndexOf<HBUINT16, Type> {};
 
-typedef Index<HBUINT16>   CFF1Index;
+typedef CFFIndex<HBUINT16>  CFF1Index;
 typedef CFF1Index         CFF1CharStrings;
 typedef FDArray<HBUINT16> CFF1FDArray;
 typedef Subrs<HBUINT16>   CFF1Subrs;
diff --git a/src/hb-ot-cff2-table.hh b/src/hb-ot-cff2-table.hh
index 71e00c4..f5d356d 100644
--- a/src/hb-ot-cff2-table.hh
+++ b/src/hb-ot-cff2-table.hh
@@ -38,7 +38,7 @@
  */
 #define HB_OT_TAG_cff2 HB_TAG('C','F','F','2')
 
-typedef Index<HBUINT32>   CFF2Index;
+typedef CFFIndex<HBUINT32>  CFF2Index;
 template <typename Type> struct CFF2IndexOf : IndexOf<HBUINT32, Type> {};
 
 typedef CFF2Index         CFF2CharStrings;
diff --git a/src/hb-subset-cff2.cc b/src/hb-subset-cff2.cc
index 4f865d6..7835523 100644
--- a/src/hb-subset-cff2.cc
+++ b/src/hb-subset-cff2.cc
@@ -312,7 +312,7 @@
     assert (cff2->topDict + plan.offsets.topDictSize == c.head - c.start);
     CFF2Subrs *dest = c.start_embed<CFF2Subrs> ();
     if (unlikely (dest == nullptr)) return false;
-    CFF::Index<HBUINT32> *super = dest;
+    CFFIndex<HBUINT32> *super = dest;
     if (unlikely (!super->serialize (&c, *acc.globalSubrs)))
     {
       DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF2 global subrs");
@@ -409,7 +409,7 @@
           DEBUG_MSG (SUBSET, nullptr, "CFF2 subset: local subrs unexpectedly null [%d]", i);
           return false;
         }
-        CFF::Index<HBUINT32> *super = subrs;
+        CFFIndex<HBUINT32> *super = subrs;
         if (unlikely (!super->serialize (&c, *acc.privateDicts[i].localSubrs)))
         {
           DEBUG_MSG (SUBSET, nullptr, "failed to serialize CFF2 local subrs [%d]", i);
