Your series is indeed homogeneously-typed and you can check it's type:
s = pd.Series(data=[1,2,3,4,5,'x'], index=['a','b','c','d','e','f'])
s.dtype
> dtype('O')
where 'O' is for "object". However, if you check the type of the individual elements of your series, they are different:
type(s['a'])
> int
type(s['f'])
> str
I think the key thing to remember is that if your Series or DataFrame Column is non homogenously-typed (eventhough technically homogeneously-typed of type "object"), then there are certain pandas functions that won't work.
Here is a better explanation from the pandas documentation's Essential Basic Functionality:
If a DataFrame or Panel contains homogeneously-typed data, the ndarray
can actually be modified in-place, and the changes will be reflected
in the data structure. For heterogeneous data (e.g. some of the
DataFrame’s columns are not all the same dtype), this will not be the
case. The values attribute itself, unlike the axis labels, cannot be
assigned to.
Note: When working with heterogeneous data, the dtype of the resulting ndarray will be chosen to accommodate all of the data
involved. For example, if strings are involved, the result will be of
object dtype. If there are only floats and integers, the resulting
array will be of float dtype.