Found a cheat for this ... might even work for you ...

Assuming you are wanting UPS Ground on Discount Coupons that offer Free Shipping ...

Edit the Order Total module for Discount Coupon ot_coupon.php and change it to read:
Code:
  function process() {
    global $order, $currencies, $db;

// bof: force UPS ground shipping on Free Shipping
if ($_SESSION['cc_id'] > 0) {
      $sql = "select coupon_id, coupon_amount, coupon_type, coupon_minimum_order, uses_per_coupon, uses_per_user,
              restrict_to_products, restrict_to_categories, coupon_zone_restriction, coupon_code
              from " . TABLE_COUPONS . "
              where coupon_id= :couponIDEntered
              and coupon_active='Y'";
      $sql = $db->bindVars($sql, ':couponIDEntered', $_SESSION['cc_id'], 'string');

      $coupon_result=$db->Execute($sql);

  if ($coupon_result->fields['coupon_type'] == 'S') {
    if ($_SESSION['shipping']['id'] != 'ups_GND') {
      $_SESSION['shipping']['id'] = 'ups_GND';
      zen_redirect(zen_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL', true, false));
    }
  }
}
// eof: force UPS ground shipping on Free Shipping

    $order_total = $this->get_order_total();
What this does is if any other shipping is selected besides ups_GND, it will loop back to the checkout_shipping and have the shipping changed to UPS Ground ... when there is a Discount Coupon that is set for Free Shipping ...

NOTE: You can do other customizations to make this more elequent, or add a message for this, or make shipping modules disappear, or other choices disappear etc. ... depending on how much work you want to put into this ...