It got a bit complicated, but here goes:
SELECT IF(MONTH(DATE_ADD('2010-07-02', INTERVAL 28 DAY)) = MONTH('2010-07-02'),
DATE_ADD('2010-07-02', INTERVAL 35 DAY),
DATE_ADD('2010-07-02', INTERVAL 28 DAY));
Rationale: If you add 4 weeks or 5 weeks, you're still on the same day; since all months are between 28 and 35 days long, if 4 weeks later is still the same month, add another week.
UPDATE: Umm, I did not think this through very well - it works for first X in month, but necessarily for 2nd, 3rd... (i.e. 3rd X in month might return a 2nd X next month). Try #2:
SELECT IF(
CEIL(DAY(DATE_ADD('2010-07-02', INTERVAL 35 DAY)) / 7) = CEIL(DAY('2010-07-02') / 7),
DATE_ADD('2010-07-02', INTERVAL 35 DAY),
DATE_ADD('2010-07-02', INTERVAL 28 DAY));
Rationale: CEIL(DAY(x) / 7)
is x's week number. If it's different when you add 5 weeks, then add 4 weeks.
UPDATE 2: LOL, I suck today, I should really think before I post... Week is usually defined as Mon-Sun, or Sun-Mon, not as from whatever started the month till 6 days later. To compensate for this:
SELECT IF(
CEIL((DAY(DATE_ADD('2010-07-02', INTERVAL 28 DAY)) - DAYOFWEEK('2010-07-02')) / 7)
= CEIL((DAY('2010-07-02') - DAYOFWEEK('2010-07-02')) / 7),
DATE_ADD('2010-07-02', INTERVAL 28 DAY),
DATE_ADD('2010-07-02', INTERVAL 35 DAY));