Product::isInStock is misleading. This does not check if product is in stock, but just checks if enabled.
Product::getQty does not look for qty key in the correct place. Perhaps in some parts of the app, qty is set on the Product::_data array directly, but my screenshot shows that this is not the case in the product/price/amount/default.phtml template. Because this is the implementation of the SaleableInterface, this is a problem for abstraction.