diff --git a/quiche/binary_http/binary_http_message.cc b/quiche/binary_http/binary_http_message.cc
index 360c56d..1a6a149 100644
--- a/quiche/binary_http/binary_http_message.cc
+++ b/quiche/binary_http/binary_http_message.cc
@@ -228,7 +228,7 @@
   if (status_code > 199) {
     return absl::InvalidArgumentError("status code > 199");
   }
-  InformationalResponseInternal data(status_code);
+  InformationalResponse data(status_code);
   for (Field& header : header_fields) {
     data.AddField(header.name, std::move(header.value));
   }
@@ -241,16 +241,6 @@
   return EncodeAsKnownLength();
 }
 
-std::vector<BinaryHttpResponse::InformationalResponse>
-BinaryHttpResponse::GetInformationalResponse() const {
-  std::vector<InformationalResponse> data;
-  data.reserve(informational_response_control_data_.size());
-  for (const auto& control_data : informational_response_control_data_) {
-    data.push_back({control_data.response_code(), control_data.fields()});
-  }
-  return data;
-}
-
 absl::StatusOr<std::string> BinaryHttpResponse::EncodeAsKnownLength() const {
   std::string data;
   data.resize(EncodedSize());
@@ -285,21 +275,20 @@
          EncodedKnownLengthFieldsAndBodySize();
 }
 
-void BinaryHttpResponse::InformationalResponseInternal::AddField(
-    absl::string_view name, std::string value) {
+void BinaryHttpResponse::InformationalResponse::AddField(absl::string_view name,
+                                                         std::string value) {
   fields_.AddField({absl::AsciiStrToLower(name), std::move(value)});
 }
 
 // Appends the encoded fields and body to data.
-absl::Status BinaryHttpResponse::InformationalResponseInternal::Encode(
+absl::Status BinaryHttpResponse::InformationalResponse::Encode(
     quiche::QuicheDataWriter& writer) const {
-  writer.WriteVarInt62(response_code_);
+  writer.WriteVarInt62(status_code_);
   return fields_.Encode(writer);
 }
 
-uint64_t BinaryHttpResponse::InformationalResponseInternal::EncodedSize()
-    const {
-  return quiche::QuicheDataWriter::GetVarInt62Len(response_code_) +
+uint64_t BinaryHttpResponse::InformationalResponse::EncodedSize() const {
+  return quiche::QuicheDataWriter::GetVarInt62Len(status_code_) +
          fields_.EncodedSize();
 }
 
diff --git a/quiche/binary_http/binary_http_message.h b/quiche/binary_http/binary_http_message.h
index 843b860..e49b6a9 100644
--- a/quiche/binary_http/binary_http_message.h
+++ b/quiche/binary_http/binary_http_message.h
@@ -60,6 +60,10 @@
       return fields_;
     }
 
+    bool operator==(const BinaryHttpMessage::Fields& rhs) const {
+      return fields_ == rhs.fields_;
+    }
+
     // Encode fields in insertion order.
     // https://www.ietf.org/archive/id/draft-ietf-httpbis-binary-message-06.html#name-header-and-trailer-field-li
     absl::Status Encode(quiche::QuicheDataWriter& writer) const;
@@ -129,14 +133,47 @@
 class QUICHE_EXPORT_PRIVATE BinaryHttpResponse : public BinaryHttpMessage {
  public:
   // https://www.ietf.org/archive/id/draft-ietf-httpbis-binary-message-06.html#name-response-control-data
-  struct InformationalResponse {
-    uint16_t status_code;
-    const std::vector<Field>& header_fields;
+  // A response can contain 0 to N informational responses.  Each informational
+  // response contains a status code followed by a header field. Valid status
+  // codes are [100,199].
+  class InformationalResponse {
+   public:
+    explicit InformationalResponse(uint16_t status_code)
+        : status_code_(status_code) {}
+    InformationalResponse(uint16_t status_code,
+                          const std::vector<BinaryHttpMessage::Field>& fields)
+        : status_code_(status_code) {
+      for (const BinaryHttpMessage::Field& field : fields) {
+        AddField(field.name, field.value);
+      }
+    }
+
     bool operator==(
         const BinaryHttpResponse::InformationalResponse& rhs) const {
-      return status_code == rhs.status_code &&
-             header_fields == rhs.header_fields;
+      return status_code_ == rhs.status_code_ && fields_ == rhs.fields_;
     }
+
+    // Adds a field with the provided name, converted to lower case.
+    // Fields are in the order they are added.
+    void AddField(absl::string_view name, std::string value);
+
+    const std::vector<BinaryHttpMessage::Field>& fields() const {
+      return fields_.fields();
+    }
+
+    uint16_t status_code() const { return status_code_; }
+
+   private:
+    // Give BinaryHttpResponse access to Encoding functionality.
+    friend class BinaryHttpResponse;
+
+    uint64_t EncodedSize() const;
+
+    // Appends the encoded fields and body to `writer`.
+    absl::Status Encode(quiche::QuicheDataWriter& writer) const;
+
+    const uint16_t status_code_;
+    BinaryHttpMessage::Fields fields_;
   };
 
   explicit BinaryHttpResponse(uint16_t status_code)
@@ -152,45 +189,20 @@
                                         std::vector<Field> header_fields);
 
   uint16_t status_code() const { return status_code_; }
+
   // References in the returned `ResponseControlData` are invalidated on
   // `BinaryHttpResponse` object mutations.
-  std::vector<InformationalResponse> GetInformationalResponse() const;
+  const std::vector<InformationalResponse>& informational_responses() const {
+    return informational_response_control_data_;
+  }
 
  private:
-  //
-  // Valid response codes are [100,199].
-  // TODO(bschneider): Collapse this inner class into the public
-  // `InformationalResponse` struct.
-  class InformationalResponseInternal {
-   public:
-    explicit InformationalResponseInternal(uint16_t response_code)
-        : response_code_(response_code) {}
-
-    void AddField(absl::string_view name, std::string value);
-
-    // Appends the encoded fields and body to `writer`.
-    absl::Status Encode(quiche::QuicheDataWriter& writer) const;
-
-    uint64_t EncodedSize() const;
-
-    uint16_t response_code() const { return response_code_; }
-
-    const std::vector<BinaryHttpMessage::Field>& fields() const {
-      return fields_.fields();
-    }
-
-   private:
-    const uint16_t response_code_;
-    BinaryHttpMessage::Fields fields_;
-  };
-
   // Returns Binary Http known length request formatted response.
   absl::StatusOr<std::string> EncodeAsKnownLength() const;
 
   uint64_t EncodedSize() const;
 
-  std::vector<InformationalResponseInternal>
-      informational_response_control_data_;
+  std::vector<InformationalResponse> informational_response_control_data_;
   const uint16_t status_code_;
 };
 }  // namespace quiche
diff --git a/quiche/binary_http/binary_http_message_test.cc b/quiche/binary_http/binary_http_message_test.cc
index 581848e..7d22bf3 100644
--- a/quiche/binary_http/binary_http_message_test.cc
+++ b/quiche/binary_http/binary_http_message_test.cc
@@ -264,7 +264,7 @@
       {"server", "Apache"}};
   ASSERT_THAT(response.GetHeaderFields(), ContainerEq(expected_fields));
   ASSERT_EQ(response.body(), "");
-  ASSERT_TRUE(response.GetInformationalResponse().empty());
+  ASSERT_TRUE(response.informational_responses().empty());
 }
 
 TEST(BinaryHttpResponse, EncodeBody) {
@@ -318,7 +318,7 @@
       {"server", "Apache"}};
   ASSERT_THAT(response.GetHeaderFields(), ContainerEq(expected_fields));
   ASSERT_EQ(response.body(), "Hello, world!\r\n");
-  ASSERT_TRUE(response.GetInformationalResponse().empty());
+  ASSERT_TRUE(response.informational_responses().empty());
 }
 
 TEST(BHttpResponse, AddBadInformationalResponseCode) {
@@ -482,7 +482,7 @@
       {"link", "</script.js>; rel=preload; as=script"}};
   std::vector<BinaryHttpResponse::InformationalResponse> expected_control = {
       {102, header102}, {103, header103}};
-  ASSERT_THAT(response.GetInformationalResponse(),
+  ASSERT_THAT(response.informational_responses(),
               ContainerEq(expected_control));
 }
 
