The compute-slots method for does a transformation of #:allocation #:instance slots to #:allocation #:virtual slots, but in doing so it discards all slot options besides the standard ones. This means that a metaclass that inherits from won't work as expected if it relies upon custom slot options. Test case: (use-modules (oop goops) (srfi srfi-111)) (define-class ()) (define (boxed-slot? slot) (get-keyword #:box? (slot-definition-options slot))) (define-method (compute-getter-method (class ) slot) (if (boxed-slot? slot) (make #:specializers (list class) #:procedure (let ((slot-name (slot-definition-name slot))) (lambda (obj) (unbox (slot-ref obj slot-name))))) (next-method))) (define-method (compute-setter-method (class ) slot) (if (boxed-slot? slot) (make #:specializers (list class ) #:procedure (let ((slot-name (slot-definition-name slot))) (lambda (obj value) (set-box! (slot-ref obj slot-name) value)))) (next-method))) (define-class ( )) (define-class () (bar #:accessor bar #:box? #t #:init-form (box 123)) #:metaclass ) (define-class () (bar #:accessor bar #:box? #t #:init-form (box 123)) #:metaclass ) ;; This works: (pk (+ (bar (make )) 456)) ;; This throws an error: (pk (+ (bar (make )) 456)) Attached is a patch that preserves all slot options that redefinable classes do not need to alter, including custom ones. How does it look? - Dave