 /// IDs are not meaningful outside of their connection.
 // TODO(cory): We can remove this thread-safety limitation by embedding an atomic
 // here, but NIO doesn't let us do it.
-public struct HTTP2StreamID {
-    fileprivate class _AbstractStreamID {
-        /// The actual stream ID. Set to a negative number in cases where we don't know the
-        /// stream ID yet.
-        fileprivate var actualStreamID: Int32 = -1
-    }
-
-    fileprivate var id: _AbstractStreamID
+public class HTTP2StreamID {
+    /// The actual stream ID. Set to a negative number in cases where we don't know the
+    /// stream ID yet.
+    fileprivate var actualStreamID: Int32 = -1
 
     /// The root stream on a HTTP/2 connection, stream 0.
     ///

        precondition(oldValue == nil, "Mapping abstract stream ID that already has a mapping!")

        // Now we set the actual stream ID.
        streamID.id.actualStreamID = networkStreamID
    }

    /// Returns the internal `HTTP2StreamID` for a given network stream ID.

    ///
    /// An abstract stream ID represents a handle to a stream ID that may or may not yet
    /// have been reified on the network.
    public init() { }

    /// Create a `HTTP2StreamID` for a known network ID.
    ///
    /// This is used to initialize the global "stream 0" stream ID.
    fileprivate init(knownID: Int32) {
        self.actualStreamID = knownID
    }

    /// The stream ID used on the network, if there is one.
