diff --git a/core/fpdfapi/parser/cpdf_cross_ref_table.h b/core/fpdfapi/parser/cpdf_cross_ref_table.h
index d76e29c..3c05c49 100644
--- a/core/fpdfapi/parser/cpdf_cross_ref_table.h
+++ b/core/fpdfapi/parser/cpdf_cross_ref_table.h
@@ -20,7 +20,6 @@
   enum class ObjectType : uint8_t {
     kFree = 0x00,
     kNormal = 0x01,
-    kNotCompressed = kNormal,
     kCompressed = 0x02,
     kObjStream = 0xFF,
     kNull = kObjStream,
@@ -30,7 +29,7 @@
     ObjectInfo() = default;
 
     // If `type` is `ObjectType::kCompressed`, `archive` should be used.
-    // If `type` is `ObjectType::kNotCompressed`, `pos` should be used.
+    // If `type` is `ObjectType::kNormal`, `pos` should be used.
     // In other cases, it is unused.
     union {
       FX_FILESIZE pos = 0;
diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp
index dd4af5a..ab3cb9f 100644
--- a/core/fpdfapi/parser/cpdf_parser.cpp
+++ b/core/fpdfapi/parser/cpdf_parser.cpp
@@ -66,7 +66,7 @@
     case 0:
       return CPDF_Parser::ObjectType::kFree;
     case 1:
-      return CPDF_Parser::ObjectType::kNotCompressed;
+      return CPDF_Parser::ObjectType::kNormal;
     case 2:
       return CPDF_Parser::ObjectType::kCompressed;
     default:
@@ -189,7 +189,7 @@
     case ObjectType::kFree:
     case ObjectType::kNull:
       return true;
-    case ObjectType::kNotCompressed:
+    case ObjectType::kNormal:
     case ObjectType::kCompressed:
       return false;
   }
@@ -575,7 +575,7 @@
         // greated than max<uint16_t>. Needs solve this issue.
         const int32_t version = FXSYS_atoi(pEntry + 11);
         info.gennum = version;
-        info.type = ObjectType::kNotCompressed;
+        info.type = ObjectType::kNormal;
       }
     }
     entries_to_read -= entries_in_block;
@@ -863,7 +863,7 @@
     // Per ISO 32000-1:2008 table 17, use the default value of 1 for the xref
     // stream entry when it is not specified. The `type` assignment is the
     // equivalent to calling GetObjectTypeFromCrossRefStreamType(1).
-    type = ObjectType::kNotCompressed;
+    type = ObjectType::kNormal;
   }
 
   const ObjectType existing_type = GetObjectType(obj_num);
@@ -882,7 +882,7 @@
     return;
   }
 
-  if (type == ObjectType::kNotCompressed) {
+  if (type == ObjectType::kNormal) {
     const uint32_t offset = GetSecondXRefStreamEntry(entry_span, field_widths);
     if (pdfium::base::IsValueInRangeForNumericType<FX_FILESIZE>(offset))
       m_CrossRefTable->AddNormal(obj_num, 0, offset);
@@ -977,7 +977,7 @@
     return nullptr;
 
   ScopedSetInsertion<uint32_t> local_insert(&m_ParsingObjNums, objnum);
-  if (GetObjectType(objnum) == ObjectType::kNotCompressed) {
+  if (GetObjectType(objnum) == ObjectType::kNormal) {
     FX_FILESIZE pos = GetObjectPositionOrZero(objnum);
     if (pos <= 0)
       return nullptr;
diff --git a/core/fpdfapi/parser/cpdf_parser_unittest.cpp b/core/fpdfapi/parser/cpdf_parser_unittest.cpp
index 0759807..acaf9cb 100644
--- a/core/fpdfapi/parser/cpdf_parser_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_parser_unittest.cpp
@@ -188,11 +188,11 @@
     static const FX_FILESIZE kOffsets[] = {0, 17, 81, 0, 331, 409};
     static const CPDF_TestParser::ObjectType kTypes[] = {
         CPDF_TestParser::ObjectType::kFree,
-        CPDF_TestParser::ObjectType::kNotCompressed,
-        CPDF_TestParser::ObjectType::kNotCompressed,
+        CPDF_TestParser::ObjectType::kNormal,
+        CPDF_TestParser::ObjectType::kNormal,
         CPDF_TestParser::ObjectType::kFree,
-        CPDF_TestParser::ObjectType::kNotCompressed,
-        CPDF_TestParser::ObjectType::kNotCompressed};
+        CPDF_TestParser::ObjectType::kNormal,
+        CPDF_TestParser::ObjectType::kNormal};
     static_assert(std::size(kOffsets) == std::size(kTypes),
                   "kOffsets / kTypes size mismatch");
     for (size_t i = 0; i < std::size(kOffsets); ++i) {
@@ -223,16 +223,16 @@
         CPDF_TestParser::ObjectType::kFree,
         CPDF_TestParser::ObjectType::kFree,
         CPDF_TestParser::ObjectType::kFree,
-        CPDF_TestParser::ObjectType::kNotCompressed,
+        CPDF_TestParser::ObjectType::kNormal,
         CPDF_TestParser::ObjectType::kFree,
         CPDF_TestParser::ObjectType::kFree,
         CPDF_TestParser::ObjectType::kFree,
         CPDF_TestParser::ObjectType::kFree,
-        CPDF_TestParser::ObjectType::kNotCompressed,
-        CPDF_TestParser::ObjectType::kNotCompressed,
+        CPDF_TestParser::ObjectType::kNormal,
+        CPDF_TestParser::ObjectType::kNormal,
         CPDF_TestParser::ObjectType::kFree,
         CPDF_TestParser::ObjectType::kFree,
-        CPDF_TestParser::ObjectType::kNotCompressed};
+        CPDF_TestParser::ObjectType::kNormal};
     static_assert(std::size(kOffsets) == std::size(kTypes),
                   "kOffsets / kTypes size mismatch");
     for (size_t i = 0; i < std::size(kOffsets); ++i) {
@@ -263,16 +263,16 @@
         CPDF_TestParser::ObjectType::kFree,
         CPDF_TestParser::ObjectType::kFree,
         CPDF_TestParser::ObjectType::kFree,
-        CPDF_TestParser::ObjectType::kNotCompressed,
+        CPDF_TestParser::ObjectType::kNormal,
         CPDF_TestParser::ObjectType::kFree,
         CPDF_TestParser::ObjectType::kFree,
         CPDF_TestParser::ObjectType::kFree,
         CPDF_TestParser::ObjectType::kFree,
         CPDF_TestParser::ObjectType::kFree,
-        CPDF_TestParser::ObjectType::kNotCompressed,
+        CPDF_TestParser::ObjectType::kNormal,
         CPDF_TestParser::ObjectType::kFree,
         CPDF_TestParser::ObjectType::kFree,
-        CPDF_TestParser::ObjectType::kNotCompressed};
+        CPDF_TestParser::ObjectType::kNormal};
     static_assert(std::size(kOffsets) == std::size(kTypes),
                   "kOffsets / kTypes size mismatch");
     for (size_t i = 0; i < std::size(kOffsets); ++i) {
@@ -299,12 +299,12 @@
     static const FX_FILESIZE kOffsets[] = {0, 23, 0, 0, 0, 45, 179};
     static const CPDF_TestParser::ObjectType kTypes[] = {
         CPDF_TestParser::ObjectType::kFree,
-        CPDF_TestParser::ObjectType::kNotCompressed,
+        CPDF_TestParser::ObjectType::kNormal,
         CPDF_TestParser::ObjectType::kFree,
         CPDF_TestParser::ObjectType::kFree,
         CPDF_TestParser::ObjectType::kFree,
-        CPDF_TestParser::ObjectType::kNotCompressed,
-        CPDF_TestParser::ObjectType::kNotCompressed};
+        CPDF_TestParser::ObjectType::kNormal,
+        CPDF_TestParser::ObjectType::kNormal};
     static_assert(std::size(kOffsets) == std::size(kTypes),
                   "kOffsets / kTypes size mismatch");
     for (size_t i = 0; i < std::size(kOffsets); ++i) {
@@ -332,7 +332,7 @@
     ASSERT_TRUE(parser.LoadCrossRefV4(0, false));
     for (size_t i = 0; i < 2048; ++i) {
       EXPECT_EQ(static_cast<int>(i) + 1, GetObjInfo(parser, i).pos);
-      EXPECT_EQ(CPDF_TestParser::ObjectType::kNotCompressed,
+      EXPECT_EQ(CPDF_TestParser::ObjectType::kNormal,
                 GetObjInfo(parser, i).type);
     }
   }
