diff --git a/vendor/magento/module-quote/Model/Quote/Address/Total/Shipping.php b/vendor/magento/module-quote/Model/Quote/Address/Total/Shipping.php
index 3ce148ee80b..aef9fb04c19 100644
--- a/vendor/magento/module-quote/Model/Quote/Address/Total/Shipping.php
+++ b/vendor/magento/module-quote/Model/Quote/Address/Total/Shipping.php
@@ -71,15 +71,14 @@ class Shipping extends \Magento\Quote\Model\Quote\Address\Total\AbstractTotal
         $address->setItemQty($data['addressQty']);
         $address->setWeight($data['addressWeight']);
         $address->setFreeMethodWeight($data['freeMethodWeight']);
-        $addressFreeShipping = (bool)$address->getFreeShipping();
+
         $isFreeShipping = $this->freeShipping->isFreeShipping($quote, $shippingAssignment->getItems());
         $address->setFreeShipping($isFreeShipping);
-        if (!$addressFreeShipping && $isFreeShipping) {
-            $data = $this->getAssignmentWeightData($address, $shippingAssignment->getItems());
-            $address->setItemQty($data['addressQty']);
-            $address->setWeight($data['addressWeight']);
-            $address->setFreeMethodWeight($data['freeMethodWeight']);
-        }
+        // recalculate weights
+        $data = $this->getAssignmentWeightData($address, $shippingAssignment->getItems());
+        $address->setItemQty($data['addressQty']);
+        $address->setWeight($data['addressWeight']);
+        $address->setFreeMethodWeight($data['freeMethodWeight']);

         $address->collectShippingRates();

diff --git a/vendor/magento/module-shipping/Model/Carrier/AbstractCarrier.php b/vendor/magento/module-shipping/Model/Carrier/AbstractCarrier.php
index 0965c4a472c..e80b0f89b19 100644
--- a/vendor/magento/module-shipping/Model/Carrier/AbstractCarrier.php
+++ b/vendor/magento/module-shipping/Model/Carrier/AbstractCarrier.php
@@ -404,6 +404,23 @@ abstract class AbstractCarrier extends \Magento\Framework\DataObject implements
         return $this->getConfigData('sort_order');
     }

+    /**
+     * Check if the request has free shipping weight
+     *
+     * @param \Magento\Quote\Model\Quote\Address\RateRequest $request
+     * @return bool
+     */
+    private function hasFreeMethodWeight($request): bool
+    {
+        return (
+            $request->getFreeShipping()
+            || (
+                $request->hasFreeMethodWeight()
+                && ((float) $request->getFreeMethodWeight()) !== ((float) $request->getPackageWeight())
+            )
+        );
+    }
+
     /**
      * Allows free shipping when all product items have free shipping.
      *
@@ -414,10 +431,7 @@ abstract class AbstractCarrier extends \Magento\Framework\DataObject implements
      */
     protected function _updateFreeMethodQuote($request)
     {
-        if (!$request->getFreeShipping()) {
-            return;
-        }
-        if ($request->getFreeMethodWeight() == $request->getPackageWeight() || !$request->hasFreeMethodWeight()) {
+        if (!$this->hasFreeMethodWeight($request)) {
             return;
         }

