One approach to objct-oriented logic programming is to amalgamate the object-level and the meta-level, treating objects as sets of formulas (theories) and message passing as querying the appropriate theory. However, the languages are untyped, so missing out on the benefits of a type system, and lack the means to encapsulate objects, so exposing all of the representation and implementation details of an object to the rest of the program. We develop a type system for object-oriented logic programming where meta-level to object-level reflection is type-safe, and where encapsulation of objects is enforced in the type system itself. This requires a typed meta-interpreter for amalgamated logic programming and to achieve this we introduce bounded polymorphic types based on inclusion and membership.