diff --git a/quiche/http2/core/priority_write_scheduler.h b/quiche/http2/core/priority_write_scheduler.h
index 1c3820d..ff867a9 100644
--- a/quiche/http2/core/priority_write_scheduler.h
+++ b/quiche/http2/core/priority_write_scheduler.h
@@ -46,6 +46,12 @@
  public:
   using StreamPrecedenceType = spdy::StreamPrecedence<StreamIdType>;
 
+  static constexpr int kHighestPriority = 0;
+  static constexpr int kLowestPriority = 7;
+
+  static_assert(spdy::kV3HighestPriority == kHighestPriority);
+  static_assert(spdy::kV3LowestPriority == kLowestPriority);
+
   // Registers new stream `stream_id` with the scheduler, assigning it the
   // given precedence. If the scheduler supports stream dependencies, the
   // stream is inserted into the dependency tree under
@@ -98,7 +104,7 @@
     auto it = stream_infos_.find(stream_id);
     if (it == stream_infos_.end()) {
       QUICHE_DVLOG(1) << "Stream " << stream_id << " not registered";
-      return StreamPrecedenceType(spdy::kV3LowestPriority);
+      return StreamPrecedenceType(kLowestPriority);
     }
     return StreamPrecedenceType(it->second->priority);
   }
@@ -169,8 +175,8 @@
     }
     int64_t last_event_time_usec = 0;
     const StreamInfo* const stream_info = it->second.get();
-    for (spdy::SpdyPriority p = spdy::kV3HighestPriority;
-         p < stream_info->priority; ++p) {
+    for (spdy::SpdyPriority p = kHighestPriority; p < stream_info->priority;
+         ++p) {
       last_event_time_usec = std::max(last_event_time_usec,
                                       priority_infos_[p].last_event_time_usec);
     }
@@ -193,8 +199,7 @@
   // Preconditions: `HasReadyStreams() == true`
   std::tuple<StreamIdType, StreamPrecedenceType>
   PopNextReadyStreamAndPrecedence() {
-    for (spdy::SpdyPriority p = spdy::kV3HighestPriority;
-         p <= spdy::kV3LowestPriority; ++p) {
+    for (spdy::SpdyPriority p = kHighestPriority; p <= kLowestPriority; ++p) {
       ReadyList& ready_list = priority_infos_[p].ready_list;
       if (!ready_list.empty()) {
         StreamInfo* const info = ready_list.front();
@@ -209,7 +214,7 @@
       }
     }
     QUICHE_BUG(spdy_bug_19_6) << "No ready streams available";
-    return std::make_tuple(0, StreamPrecedenceType(spdy::kV3LowestPriority));
+    return std::make_tuple(0, StreamPrecedenceType(kLowestPriority));
   }
 
   // Returns true if there's another stream ahead of the given stream in the
@@ -226,8 +231,8 @@
 
     // If there's a higher priority stream, this stream should yield.
     const StreamInfo* const stream_info = it->second.get();
-    for (spdy::SpdyPriority p = spdy::kV3HighestPriority;
-         p < stream_info->priority; ++p) {
+    for (spdy::SpdyPriority p = kHighestPriority; p < stream_info->priority;
+         ++p) {
       if (!priority_infos_[p].ready_list.empty()) {
         return true;
       }
@@ -359,7 +364,7 @@
   // Number of ready streams.
   size_t num_ready_streams_ = 0;
   // Per-priority state, including ready lists.
-  PriorityInfo priority_infos_[spdy::kV3LowestPriority + 1];
+  PriorityInfo priority_infos_[kLowestPriority + 1];
   // StreamInfos for all registered streams.
   StreamInfoMap stream_infos_;
 };
diff --git a/quiche/http2/core/priority_write_scheduler_test.cc b/quiche/http2/core/priority_write_scheduler_test.cc
index e94e522..e8a54dd 100644
--- a/quiche/http2/core/priority_write_scheduler_test.cc
+++ b/quiche/http2/core/priority_write_scheduler_test.cc
@@ -13,7 +13,6 @@
 namespace test {
 
 using ::spdy::kHttp2RootStreamId;
-using ::spdy::kV3LowestPriority;
 using ::spdy::SpdyPriority;
 using ::spdy::SpdyStreamId;
 using ::spdy::SpdyStreamPrecedence;
@@ -37,6 +36,9 @@
 
 class PriorityWriteSchedulerTest : public quiche::test::QuicheTest {
  public:
+  static constexpr int kLowestPriority =
+      PriorityWriteScheduler<SpdyStreamId>::kLowestPriority;
+
   PriorityWriteSchedulerTest() : peer_(&scheduler_) {}
 
   PriorityWriteScheduler<SpdyStreamId> scheduler_;
@@ -105,7 +107,7 @@
 TEST_F(PriorityWriteSchedulerTest, GetStreamPrecedence) {
   // Unknown streams tolerated due to b/15676312. However, return lowest
   // priority.
-  EXPECT_EQ(kV3LowestPriority,
+  EXPECT_EQ(kLowestPriority,
             scheduler_.GetStreamPrecedence(1).spdy3_priority());
 
   scheduler_.RegisterStream(1, SpdyStreamPrecedence(3));
@@ -135,7 +137,7 @@
   EXPECT_EQ(6, scheduler_.GetStreamPrecedence(1).spdy3_priority());
 
   scheduler_.UnregisterStream(1);
-  EXPECT_EQ(kV3LowestPriority,
+  EXPECT_EQ(kLowestPriority,
             scheduler_.GetStreamPrecedence(1).spdy3_priority());
 }
 
@@ -151,12 +153,12 @@
   // For the moment, updating stream precedence on a non-registered stream
   // should have no effect. In the future, it will lazily cause the stream to
   // be registered (b/15676312).
-  EXPECT_EQ(kV3LowestPriority,
+  EXPECT_EQ(kLowestPriority,
             scheduler_.GetStreamPrecedence(3).spdy3_priority());
   EXPECT_FALSE(scheduler_.StreamRegistered(3));
   scheduler_.UpdateStreamPrecedence(3, SpdyStreamPrecedence(1));
   EXPECT_FALSE(scheduler_.StreamRegistered(3));
-  EXPECT_EQ(kV3LowestPriority,
+  EXPECT_EQ(kLowestPriority,
             scheduler_.GetStreamPrecedence(3).spdy3_priority());
 
   scheduler_.RegisterStream(3, SpdyStreamPrecedence(1));
