   /// This resolves outer boxed types to their underlying lowering.
   public func lowerType(_ type: GIRType) -> Lowering {
     guard let boxType = type as? BoxType else {
-      fatalError("FIXME: Only @box types respond to this query!")
-    }
+      let cacheKey = CacheKey(loweredType: type)
+      guard let existing = self.loweringCache[cacheKey] else {
+        fatalError("Lowering referencing uncached type? \(type)")
+      }
+      return existing
+    }
+
     let cacheKey = CacheKey(name: boxType.payloadTypeName)
     guard let existing = self.loweringCache[cacheKey] else {
       fatalError("Formed box referencing uncached type? \(boxType)")


    init(payloadOf name: String) {
      self.details = .constructorPayload(name)
    }

    static func == (lhs: CacheKey, rhs: CacheKey) -> Bool {

      case meta(Meta)
      case nominal(String)
      case constructorPayload(String)
      case loweredType(GIRType)
    }
    private let details: Details

