diff --git a/net/base/load_flags_to_string.cc b/net/base/load_flags_to_string.cc
index 6a5ea56253390..a75cf81e2d75a 100644
--- a/net/base/load_flags_to_string.cc
+++ b/net/base/load_flags_to_string.cc
@@ -53,7 +53,7 @@ std::string LoadFlagsToString(int load_flags) {
   flag_names.reserve(expected_size);
   // Skip the first entry in kInfo as including LOAD_NORMAL in the output would
   // be confusing.
-  for (const auto& flag : base::span(kInfo).subspan(1)) {
+  for (const auto& flag : base::span(kInfo).subspan<1>()) {
     if (load_flags & flag.value) {
       flag_names.push_back(flag.name);
     }
diff --git a/net/base/lookup_string_in_fixed_set.cc b/net/base/lookup_string_in_fixed_set.cc
index 06c0cf4123613..b50e707b02fd2 100644
--- a/net/base/lookup_string_in_fixed_set.cc
+++ b/net/base/lookup_string_in_fixed_set.cc
@@ -113,7 +113,7 @@ bool FixedSetIncrementalLookup::Advance(char input) {
         // If this is not the last character in the label, the next byte should
         // be interpreted as a character or return value. Otherwise, the next
         // byte should be interpreted as a list of child node offsets.
-        bytes_ = bytes_.subspan(1);
+        bytes_ = bytes_.subspan<1>();
         DCHECK(!bytes_.empty());
         bytes_starts_with_label_character_ = !is_last_char_in_label;
         return true;
@@ -144,7 +144,7 @@ bool FixedSetIncrementalLookup::Advance(char input) {
           // should be interpreted as a character or return value. Otherwise,
           // the next byte should be interpreted as a list of child node
           // offsets.
-          bytes_ = offset_bytes.subspan(1);
+          bytes_ = offset_bytes.subspan<1>();
           DCHECK(!bytes_.empty());
           bytes_starts_with_label_character_ = !is_last_char_in_label;
           return true;
diff --git a/net/cert_net/cert_net_fetcher_url_request.cc b/net/cert_net/cert_net_fetcher_url_request.cc
index b4d6b62b38dbf..2352507698132 100644
--- a/net/cert_net/cert_net_fetcher_url_request.cc
+++ b/net/cert_net/cert_net_fetcher_url_request.cc
@@ -635,7 +635,7 @@ bool Job::ConsumeBytesRead(URLRequest* request, int num_bytes) {
 
   // Append the data to |response_body_|.
   response_body_.reserve(response_body_.size() + num_bytes_s);
-  base::Extend(response_body_, read_buffer_->span().subspan(0, num_bytes_s));
+  base::Extend(response_body_, read_buffer_->span().first(num_bytes_s));
   return true;
 }
 
diff --git a/net/shared_dictionary/shared_dictionary_header_checker_source_stream.cc b/net/shared_dictionary/shared_dictionary_header_checker_source_stream.cc
index bac94680a0314..8321e1e76d879 100644
--- a/net/shared_dictionary/shared_dictionary_header_checker_source_stream.cc
+++ b/net/shared_dictionary/shared_dictionary_header_checker_source_stream.cc
@@ -22,12 +22,12 @@ static constexpr size_t kCompressionTypeBrotliSignatureSize =
     sizeof(kCompressionTypeBrotliSignature);
 static constexpr size_t kCompressionTypeZstdSignatureSize =
     sizeof(kCompressionTypeZstdSignature);
-static constexpr int kCompressionDictionaryHashSize = 32;
+static constexpr size_t kCompressionDictionaryHashSize = 32;
 static_assert(sizeof(SHA256HashValue) == kCompressionDictionaryHashSize,
               "kCompressionDictionaryHashSize mismatch");
-static constexpr int kCompressionTypeBrotliHeaderSize =
+static constexpr size_t kCompressionTypeBrotliHeaderSize =
     kCompressionTypeBrotliSignatureSize + kCompressionDictionaryHashSize;
-static constexpr int kCompressionTypeZstdHeaderSize =
+static constexpr size_t kCompressionTypeZstdHeaderSize =
     kCompressionTypeZstdSignatureSize + kCompressionDictionaryHashSize;
 
 size_t GetSignatureSize(SharedDictionaryHeaderCheckerSourceStream::Type type) {
@@ -171,7 +171,7 @@ void SharedDictionaryHeaderCheckerSourceStream::HeaderCheckCompleted(
 
 base::span<const unsigned char>
 SharedDictionaryHeaderCheckerSourceStream::GetSignatureInBuffer() const {
-  return head_read_buffer_->everything().subspan(0, GetSignatureSize(type_));
+  return head_read_buffer_->everything().first(GetSignatureSize(type_));
 }
 
 base::span<const unsigned char>
diff --git a/net/socket/socket_test_util.cc b/net/socket/socket_test_util.cc
index 2880f56ff2cb3..39025b8582699 100644
--- a/net/socket/socket_test_util.cc
+++ b/net/socket/socket_test_util.cc
@@ -336,8 +336,7 @@ const MockWrite& StaticSocketDataHelper::PeekRealWrite() const {
       return writes_[i];
   }
 
-  CHECK(false) << "No write data available.";
-  return writes_[0];  // Avoid warning about unreachable missing return.
+  NOTREACHED() << "No write data available.";
 }
 
 StaticSocketDataProvider::StaticSocketDataProvider()
diff --git a/net/socket/transport_client_socket_pool_test_util.cc b/net/socket/transport_client_socket_pool_test_util.cc
index 12e5526cdba91..5eb6a69c2dfce 100644
--- a/net/socket/transport_client_socket_pool_test_util.cc
+++ b/net/socket/transport_client_socket_pool_test_util.cc
@@ -374,7 +374,7 @@ MockTransportClientSocketFactory::CreateTransportClientSocket(
   Rule rule(client_socket_type_);
   if (!rules_.empty()) {
     rule = rules_.front();
-    rules_ = rules_.subspan(1);
+    rules_ = rules_.subspan<1>();
   }
 
   if (rule.expected_addresses) {
diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc
index e852c0aab69f7..1c5a13273bef7 100644
--- a/net/spdy/spdy_network_transaction_unittest.cc
+++ b/net/spdy/spdy_network_transaction_unittest.cc
@@ -412,9 +412,10 @@ class SpdyNetworkTransactionTest
 
   void UseComplexPostRequest() {
     ASSERT_FALSE(upload_data_stream_);
-    const int kFileRangeOffset = 1;
-    const int kFileRangeLength = 3;
-    CHECK_LT(kFileRangeOffset + kFileRangeLength, kUploadDataSize);
+    static constexpr size_t kFileRangeOffset = 1;
+    static constexpr size_t kFileRangeLength = 3;
+    CHECK_LT(static_cast<int>(kFileRangeOffset + kFileRangeLength),
+             kUploadDataSize);
 
     base::FilePath file_path;
     CHECK(base::CreateTemporaryFileInDir(temp_dir_.GetPath(), &file_path));
@@ -422,14 +423,13 @@ class SpdyNetworkTransactionTest
 
     std::vector<std::unique_ptr<UploadElementReader>> element_readers;
     element_readers.push_back(std::make_unique<UploadBytesElementReader>(
-        base::byte_span_from_cstring(kUploadData)
-            .first(base::checked_cast<size_t>(kFileRangeOffset))));
+        base::byte_span_from_cstring(kUploadData).first<kFileRangeOffset>()));
     element_readers.push_back(std::make_unique<UploadFileElementReader>(
         base::SingleThreadTaskRunner::GetCurrentDefault().get(), file_path,
         kFileRangeOffset, kFileRangeLength, base::Time()));
     element_readers.push_back(std::make_unique<UploadBytesElementReader>(
         base::byte_span_from_cstring(kUploadData)
-            .subspan(kFileRangeOffset + kFileRangeLength)));
+            .subspan<kFileRangeOffset + kFileRangeLength>()));
     upload_data_stream_ = std::make_unique<ElementsUploadDataStream>(
         std::move(element_readers), 0);
 
diff --git a/net/test/embedded_test_server/websocket_connection.cc b/net/test/embedded_test_server/websocket_connection.cc
index 2b8039f3bd95c..0f3be6d738eae 100644
--- a/net/test/embedded_test_server/websocket_connection.cc
+++ b/net/test/embedded_test_server/websocket_connection.cc
@@ -263,7 +263,7 @@ void WebSocketConnection::OnReadComplete(int result)
   }
 
   base::span<uint8_t> data_span =
-      read_buffer_->span().subspan(0, static_cast<size_t>(result));
+      read_buffer_->span().first(static_cast<size_t>(result));
 
   WebSocketFrameParser parser;
   std::vector<std::unique_ptr<WebSocketFrameChunk>> frame_chunks;
diff --git a/net/test/embedded_test_server/websocket_split_packet_close_handler.cc b/net/test/embedded_test_server/websocket_split_packet_close_handler.cc
index c57488c401f97..d5b78897240ea 100644
--- a/net/test/embedded_test_server/websocket_split_packet_close_handler.cc
+++ b/net/test/embedded_test_server/websocket_split_packet_close_handler.cc
@@ -35,9 +35,10 @@ void WebSocketSplitPacketCloseHandler::SendSplitCloseFrame() {
   // Split the close frame into two parts and send each separately.
   const auto close_frame_span = close_frame->span();
 
-  const size_t split_index = 1;  // Split after the first byte
-  connection()->SendRaw(close_frame_span.subspan(0, split_index));
-  connection()->SendRaw(close_frame_span.subspan(split_index));
+  // Split after the first byte
+  const auto [first, rest] = close_frame_span.split_at<1>();
+  connection()->SendRaw(first);
+  connection()->SendRaw(rest);
   connection()->DisconnectAfterAnyWritesDone();
 }
 
diff --git a/net/websockets/websocket_frame_parser.cc b/net/websockets/websocket_frame_parser.cc
index 95a931371212c..0bcf019a4ab5c 100644
--- a/net/websockets/websocket_frame_parser.cc
+++ b/net/websockets/websocket_frame_parser.cc
@@ -156,7 +156,7 @@ size_t WebSocketFrameParser::DecodeFrameHeader(base::span<const uint8_t> data) {
 
   WebSocketMaskingKey masking_key = {};
   const bool masked = (second_byte & kMaskBit) != 0;
-  static constexpr int kMaskingKeyLength =
+  static constexpr size_t kMaskingKeyLength =
       WebSocketFrameHeader::kMaskingKeyLength;
   if (masked) {
     if (data.size() < current + kMaskingKeyLength)
@@ -194,8 +194,7 @@ std::unique_ptr<WebSocketFrameChunk> WebSocketFrameParser::DecodeFramePayload(
   frame_chunk->final_chunk = false;
   if (chunk_data_size) {
     const auto split_point = base::checked_cast<size_t>(chunk_data_size);
-    frame_chunk->payload =
-        base::as_writable_chars(data->subspan(0, split_point));
+    frame_chunk->payload = base::as_writable_chars(data->first(split_point));
     *data = data->subspan(split_point);
     frame_offset_ += chunk_data_size;
   }