kale.has_taste.indirect() contains Bitter. It is not the instance but the class, because resolving singleton is not so simple (if you want to resolve all of them, you must take into account "same as" relations between individuals).
If you really need individuals, you can remove the class Bitter, create individual bitter as an instance of Taste, and assert that: Kale.is_a.append(has_taste.value(bitter))
Re: Inferring Object Properties for Individuals Based on Asserted SomeValuesFrom
The equivalent_to relation is not sufficient to "replace" Bitter (class) by bitter (individual), because it does not prevent Bitter to be equivalent to another individual, e.g. bitter2, bitter3,...
If the property is asserted at the class level, I prefer to stay at that level -- changing level would require a true reasoning, but .indirect() does not do that, it just resolves transitive property and (now) gets the value asserted at the class level.
In my opinion, kale.has_taste should not be though as "triple" but rather as a Python attribute. In that sense, having classes in it is not a problem.
I tested the following program, and I obtain the expected results (= [t.Bitter]). Are you obtaining something else?
from owlready2 import *
onto = get_ontology('http://test.org/t.owl')
class Ingredient(Thing): pass
class Kale(Ingredient): pass
class Bitter(Ingredient): pass
class has_taste(Thing >> Thing): pass
kale = Kale("kale")
bitter = Bitter("bitter")