File: src/main/java/org/joda/time/chrono/BasicMonthOfYearDateTimeField.java
Issue: #151 Unable to add days to a MonthDay set to the ISO leap date
It's not possible to add days to a MonthDay set to the ISO leap date (February 29th). This is even more bizarre given the exact error message thrown.
Sample snippet:
final MonthDay isoLeap = new MonthDay(DateTimeConstants.FEBRUARY, 29, ISOChronology.getInstanceUTC());
System.out.println(isoLeap);
System.out.println(isoLeap.plusDays(2));

Which generates the following combined console output and stack trace: 
--02-29
Exception in thread "main" org.joda.time.IllegalFieldValueException: Value 29 for dayOfMonth must be in the range [1,28]
at org.joda.time.field.FieldUtils.verifyValueBounds(FieldUtils.java:215)
at org.joda.time.field.PreciseDurationDateTimeField.set(PreciseDurationDateTimeField.java:78)
at org.joda.time.chrono.BasicMonthOfYearDateTimeField.add(BasicMonthOfYearDateTimeField.java:212)
at org.joda.time.field.BaseDateTimeField.add(BaseDateTimeField.java:324)
at org.joda.time.MonthDay.withFieldAdded(MonthDay.java:519)
at org.joda.time.MonthDay.minusDays(MonthDay.java:672)
at ext.site.time.chrono.Main.m7(Main.java:191)
at ext.site.time.chrono.Main.main(Main.java:27)
The follwing method calls and parameters also generate the same or related error: 
isoLeap.plusMonths(1);
isoLeap.plusMonths(-1);
isoLeap.minusMonths(1);
isoLeap.minusMonths(-1);
isoLeap.minusDays(-1);

However, the following methods work: 
isoLeap.minusDays(1);
isoLeap.plusDays(-1);

Performing operations on dates around the ISO leap date react as if it exists, ie:
System.out.println(isoLeap.minusDays(1).plusDays(2));

Prints out '--03-01' as expected.

Buggy code:
public int[] add(ReadablePartial partial, int fieldIndex, int[] values, int valueToAdd) {
    // overridden as superclass algorithm can't handle
    // 2004-02-29 + 48 months -> 2008-02-29 type dates
    if (valueToAdd == 0) {
        return values;
    }
        // month is largest field and being added to, such as month-day
    if (DateTimeUtils.isContiguous(partial)) {
        long instant = 0L;
        for (int i = 0, isize = partial.size(); i < isize; i++) {
            instant = partial.getFieldType(i).getField(iChronology).set(instant, values[i]);
        }
        instant = add(instant, valueToAdd);
        return iChronology.get(partial, instant);
    } else {
        return super.add(partial, fieldIndex, values, valueToAdd);
    }
}

Fixed code:
public int[] add(ReadablePartial partial, int fieldIndex, int[] values, int valueToAdd) {
    // overridden as superclass algorithm can't handle
    // 2004-02-29 + 48 months -> 2008-02-29 type dates
    if (valueToAdd == 0) {
        return values;
    }
    if (partial.size() > 0 && partial.getFieldType(0).equals(DateTimeFieldType.monthOfYear()) && fieldIndex == 0) {
        // month is largest field and being added to, such as month-day
        int curMonth0 = partial.getValue(0) - 1;
        int newMonth = ((curMonth0 + (valueToAdd % 12) + 12) % 12) + 1;
        return set(partial, 0, values, newMonth);
    }
    if (DateTimeUtils.isContiguous(partial)) {
        long instant = 0L;
        for (int i = 0, isize = partial.size(); i < isize; i++) {
            instant = partial.getFieldType(i).getField(iChronology).set(instant, values[i]);
        }
        instant = add(instant, valueToAdd);
        return iChronology.get(partial, instant);
    } else {
        return super.add(partial, fieldIndex, values, valueToAdd);
    }
}