Monster Buff/Debuff System Design
Visibility modifiers and names

enum types are by default public static. You can choose to remove them.

Type is a very broad name for your enum, so you can consider just calling it EffectType.

switch and return

Instead of assigning the result to effect, you should return directly from each case, i.e.:

switch(type) {
case ATTACKBUFF:
    return new AttackBuff(monster, duration);
case ATTACKBREAK:
    return new AttackBreak(monster, duration);
case DEFENSEBUFF:
    return new DefenseBuff(monster, duration);
case DEFENSEBREAK:
    return new DefenseBreak(monster, duration);
// shifted default case as the last, it's more 'conventional'
default:
// case NIL:
    return new NilEffect();
}


You can also choose to place this as method for EffectType instead, but from an OOP approach, this depends if an EffectType is supposed to 'know' an Effect (and Monster) or not. Your approach is still fine.

Adding and updating effects

Since you are on Java 8, you can consider return-ing null from Map.computeIfPresent() to expire the type and remove the entry in one go:

public void addEffect(Effect.Type type, int duration) {
    effects.computeIfPresent(type, (k, effect) -&gt; { effect.expire(); return null; });
    Effect effect = Effect.newEffect(type, this, duration);
    effect.apply();
    effects.put(effect.getType(), effect);
}


Do you really need to invoke parallelStream() when updating effects? Since the maximum number of elements you can have in your Map is bounded by the number of EffectType values (BTW, you may want to switch to an EnumMap), I think the overhead of doing a concurrent access on your Map is not required. Also the forEach() operation can be done using a method reference as well, in this case:

public void updateEffects() {
    effects.values().stream().forEach(Effect::update);
}